Java Reference類


Java Reference類

Reference類時SoftReference、WeakReference、PhantomReference類的父類。

由于Reference與GC密切配合,Reference不應當被繼承實現(Reference的所有構造方法都是包訪問權限)。

Reference類的成員包括:

  1. referent,Reference類包裝的對象引用
  2. queue,引用隊列,通過構造函數傳入,引用對象在隊列上注冊,確認引用對象的狀態
  3. pending,等待隊列

Reference對象四種狀態:

  1. active,GC會特殊對待此狀態的引用,一旦被引用的對象的可達性發生變化(如失去強引用,只剩弱引用,可以被回收),GC會將引用放入pending隊列并將其狀態改為pending狀態
  2. pending,位于pending隊列,等待ReferenceHandler線程將引用入隊queue
  3. enqueue,ReferenceHandler將引用入隊queue
  4. 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;
  1. 第3行,wr創建,處于active狀態
  2. 第4行,對象o失去強引用,第5行觸發GC,回收器發現o的可達性發生變化,將referent置為null,此時wr.get返回null,將wr放入pending隊列,wr進入pending狀態,wr不關心o最終是否被回收
  3. ReferenceHandler線程從pending隊列中取出wr,將其放入queue中,wr進入enqueue狀態
  4. 調用queue.poll或queue.remove方法,wr出隊,wr進入inactive狀態

參考:http://hongjiang.info/java-referencequeue/
參考:http://mindprod.com/jgloss/phantom.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • ReferenceQueue 引用隊列,在檢測到適當的可到達性更改后,垃圾回收器將已注冊的引用對象添加到該隊列中 ...
    tomas家的小撥浪鼓閱讀 36,232評論 10 59
  • 感知GC。怎么感知:* 通過get來判斷已經被GC(PhantomReference 在任何時候get都是null...
    YDDMAX_Y閱讀 1,862評論 0 4
  • 從基礎講起 Reference 主要是負責內存的一個狀態,當然它還和java虛擬機,垃圾回收器打交道。Refere...
    小小的coder閱讀 423評論 0 0
  • 引用類型 JDK1.2之后,Java擴充了引用的概念,將引用分為強引用、軟引用、弱引用和虛引用四種。 強引用類似于...
    德彪閱讀 4,438評論 0 10
  • 每個人生存在世,隨著時間的變化,其人生的角色也在不斷的變化著,這種變化又是如此的不可逆轉,不同的角色有著不同...
    客舟聽雨2011閱讀 319評論 2 4