Java Reference類
Reference類時SoftReference、WeakReference、PhantomReference類的父類。
由于Reference與GC密切配合,Reference不應當被繼承實現(Reference的所有構造方法都是包訪問權限)。
Reference類的成員包括:
- referent,Reference類包裝的對象引用
- queue,引用隊列,通過構造函數傳入,引用對象在隊列上注冊,確認引用對象的狀態
- pending,等待隊列
Reference對象四種狀態:
- active,GC會特殊對待此狀態的引用,一旦被引用的對象的可達性發生變化(如失去強引用,只剩弱引用,可以被回收),GC會將引用放入pending隊列并將其狀態改為pending狀態
- pending,位于pending隊列,等待ReferenceHandler線程將引用入隊queue
- enqueue,ReferenceHandler將引用入隊queue
- inactive,引用從queue出隊后的最終狀態,該狀態不可變
一個弱引用的回收過程
1 Object o = new Object();
2 ReferenceQueue<Object> queue = new ReferenceQueue<>();
3 WeakReference<Object> wr = new WeakReference<>(o, queue);
4 o = null;
5 System.gc();
6 System.out.println(wr.get());
7 assert wr.get() == null;
- 第3行,wr創建,處于active狀態
- 第4行,對象o失去強引用,第5行觸發GC,回收器發現o的可達性發生變化,將referent置為null,此時wr.get返回null,將wr放入pending隊列,wr進入pending狀態,wr不關心o最終是否被回收
- ReferenceHandler線程從pending隊列中取出wr,將其放入queue中,wr進入enqueue狀態
- 調用queue.poll或queue.remove方法,wr出隊,wr進入inactive狀態
參考:http://hongjiang.info/java-referencequeue/
參考:http://mindprod.com/jgloss/phantom.html