Java Reference類
Reference類時SoftReference、WeakReference、PhantomReference類的父類。
由于Reference與GC密切配合,Reference不應(yīng)當(dāng)被繼承實現(xiàn)(Reference的所有構(gòu)造方法都是包訪問權(quán)限)。
Reference類的成員包括:
- referent嫁审,Reference類包裝的對象引用
- queue,引用隊列赖晶,通過構(gòu)造函數(shù)傳入律适,引用對象在隊列上注冊,確認(rèn)引用對象的狀態(tài)
- pending,等待隊列
Reference對象四種狀態(tài):
- active擦耀,GC會特殊對待此狀態(tài)的引用棉圈,一旦被引用的對象的可達性發(fā)生變化(如失去強引用,只剩弱引用眷蜓,可以被回收)分瘾,GC會將引用放入pending隊列并將其狀態(tài)改為pending狀態(tài)
- pending,位于pending隊列吁系,等待ReferenceHandler線程將引用入隊queue
- enqueue德召,ReferenceHandler將引用入隊queue
- inactive,引用從queue出隊后的最終狀態(tài)汽纤,該狀態(tài)不可變
一個弱引用的回收過程
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創(chuàng)建,處于active狀態(tài)
- 第4行蕴坪,對象o失去強引用肴掷,第5行觸發(fā)GC,回收器發(fā)現(xiàn)o的可達性發(fā)生變化背传,將referent置為null呆瞻,此時wr.get返回null,將wr放入pending隊列径玖,wr進入pending狀態(tài)痴脾,wr不關(guān)心o最終是否被回收
- ReferenceHandler線程從pending隊列中取出wr,將其放入queue中梳星,wr進入enqueue狀態(tài)
- 調(diào)用queue.poll或queue.remove方法赞赖,wr出隊,wr進入inactive狀態(tài)
參考:http://hongjiang.info/java-referencequeue/
參考:http://mindprod.com/jgloss/phantom.html