標籤:java 弱引用 軟引用 虛引用
Java的四種引用原始碼例子
不解釋,直接上代碼,千言萬語頂不住一行代碼。
package com.apkkids.javalanguage;import java.lang.ref.PhantomReference;import java.lang.ref.Reference;import java.lang.ref.ReferenceQueue;import java.lang.ref.SoftReference;import java.lang.ref.WeakReference;import java.lang.reflect.Field;/** * @author wxb * Java的四種引用 * 強引用:擁有強引用的對象無論何時都不會被記憶體回收 * 軟引用:只擁有軟引用的對象當記憶體不足時,會被記憶體回收 * 弱引用:只擁有弱引用的對象會在垃圾收集運行時被回收 * 虛引用:只擁有虛引用的對象和沒有引用一樣,只不過它被記憶體回收時會被放入關聯的引用隊列,並可被觀察到 * */public class FourReferenceTest { /** * @param args */ public static void main(String[] args) { //三個測試,測試其中一個時請注釋掉其他兩個 PhatomReferenceTest();// WeakReferenceTest();// SoftReferenceTest(); } static void PhatomReferenceTest(){ String s = new String("abc"); //建立一個引用隊列rq,然後用rq和s一起建立一個虛引用 final ReferenceQueue<String> rq = new ReferenceQueue<String>(); PhantomReference<String> wr = new PhantomReference<String>(s,rq); //wr.get()會永遠返回null s = null; //建立一個線程來迴圈檢測s是否加入了隊列 new Thread(){ boolean bFlag = true; @Override public void run() { Object obj = null; while(bFlag){ obj = rq.poll(); //rq中終會poll出一個PhantomReference if(obj != null){ bFlag = false; try { //使用反射的原因是PhantomReference的get方法始終返回null //即使向上轉型為Reference也不行,因此只能通過反射直接得到儲存在Reference類中的referent Field f = Reference.class.getDeclaredField("referent"); f.setAccessible(true); String s = (String) f.get(obj); System.out.println("get String from PhantomReference :"+s); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } } }.start(); try { //主線程休眠後運行gc,等待子線程運行 Thread.sleep(1000); System.gc(); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } static void WeakReferenceTest(){ String s = new String("abc"); WeakReference<String> wr = new WeakReference<String>(s); s = null; while(wr.get() != null){ System.out.println("WeakReference get :"+wr.get()); System.gc(); System.out.println("System.gc()"); } } /** * 不到記憶體耗盡該測試不會退出 */ static void SoftReferenceTest(){ String s = new String("abc"); SoftReference<String> wr = new SoftReference<String>(s); s = null; while(wr.get() != null){ System.out.println("SoftReference get :"+wr.get()); System.gc(); System.out.println("System.gc()"); } }}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Java的四種引用原始碼例子