Java Reference類
Reference類時(shí)SoftReference、WeakReference、PhantomReference類的父類。
由于Reference與GC密切配合,Reference不應(yīng)當(dāng)被繼承實(shí)現(xiàn)(Reference的所有構(gòu)造方法都是包訪問權(quán)限)。
Reference類的成員包括:
- referent,Reference類包裝的對(duì)象引用
- queue,引用隊(duì)列,通過構(gòu)造函數(shù)傳入,引用對(duì)象在隊(duì)列上注冊(cè),確認(rèn)引用對(duì)象的狀態(tài)
- pending,等待隊(duì)列
Reference對(duì)象四種狀態(tài):
- active,GC會(huì)特殊對(duì)待此狀態(tài)的引用,一旦被引用的對(duì)象的可達(dá)性發(fā)生變化(如失去強(qiáng)引用,只剩弱引用,可以被回收),GC會(huì)將引用放入pending隊(duì)列并將其狀態(tài)改為pending狀態(tài)
- pending,位于pending隊(duì)列,等待ReferenceHandler線程將引用入隊(duì)queue
- enqueue,ReferenceHandler將引用入隊(duì)queue
- inactive,引用從queue出隊(duì)后的最終狀態(tài),該狀態(tài)不可變
一個(gè)弱引用的回收過程
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行,對(duì)象o失去強(qiáng)引用,第5行觸發(fā)GC,回收器發(fā)現(xiàn)o的可達(dá)性發(fā)生變化,將referent置為null,此時(shí)wr.get返回null,將wr放入pending隊(duì)列,wr進(jìn)入pending狀態(tài),wr不關(guān)心o最終是否被回收
- ReferenceHandler線程從pending隊(duì)列中取出wr,將其放入queue中,wr進(jìn)入enqueue狀態(tài)
- 調(diào)用queue.poll或queue.remove方法,wr出隊(duì),wr進(jìn)入inactive狀態(tài)
參考:http://hongjiang.info/java-referencequeue/
參考:http://mindprod.com/jgloss/phantom.html