Java Reference類


Java Reference類

Reference類時(shí)SoftReference、WeakReference、PhantomReference類的父類。

由于Reference與GC密切配合,Reference不應(yīng)當(dāng)被繼承實(shí)現(xiàn)(Reference的所有構(gòu)造方法都是包訪問權(quán)限)。

Reference類的成員包括:

  1. referent,Reference類包裝的對(duì)象引用
  2. queue,引用隊(duì)列,通過構(gòu)造函數(shù)傳入,引用對(duì)象在隊(duì)列上注冊(cè),確認(rèn)引用對(duì)象的狀態(tài)
  3. pending,等待隊(duì)列

Reference對(duì)象四種狀態(tài):

  1. active,GC會(huì)特殊對(duì)待此狀態(tài)的引用,一旦被引用的對(duì)象的可達(dá)性發(fā)生變化(如失去強(qiáng)引用,只剩弱引用,可以被回收),GC會(huì)將引用放入pending隊(duì)列并將其狀態(tài)改為pending狀態(tài)
  2. pending,位于pending隊(duì)列,等待ReferenceHandler線程將引用入隊(duì)queue
  3. enqueue,ReferenceHandler將引用入隊(duì)queue
  4. 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;
  1. 第3行,wr創(chuàng)建,處于active狀態(tài)
  2. 第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最終是否被回收
  3. ReferenceHandler線程從pending隊(duì)列中取出wr,將其放入queue中,wr進(jìn)入enqueue狀態(tài)
  4. 調(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ReferenceQueue 引用隊(duì)列,在檢測(cè)到適當(dāng)?shù)目傻竭_(dá)性更改后,垃圾回收器將已注冊(cè)的引用對(duì)象添加到該隊(duì)列中 ...
    tomas家的小撥浪鼓閱讀 36,877評(píng)論 10 59
  • 感知GC。怎么感知:* 通過get來判斷已經(jīng)被GC(PhantomReference 在任何時(shí)候get都是null...
    YDDMAX_Y閱讀 1,987評(píng)論 0 4
  • 從基礎(chǔ)講起 Reference 主要是負(fù)責(zé)內(nèi)存的一個(gè)狀態(tài),當(dāng)然它還和java虛擬機(jī),垃圾回收器打交道。Refere...
    小小的coder閱讀 515評(píng)論 0 0
  • 引用類型 JDK1.2之后,Java擴(kuò)充了引用的概念,將引用分為強(qiáng)引用、軟引用、弱引用和虛引用四種。 強(qiáng)引用類似于...
    德彪閱讀 4,959評(píng)論 0 10
  • 每個(gè)人生存在世,隨著時(shí)間的變化,其人生的角色也在不斷的變化著,這種變化又是如此的不可逆轉(zhuǎn),不同的角色有著不同...
    客舟聽雨2011閱讀 357評(píng)論 2 4

友情鏈接更多精彩內(nèi)容