分析java對象的幾種引用(reference)
java對象的引用reference分為有強引用,軟引用,弱引用,虛引用這幾種形式。
1、Soft Reference(軟引用)
指到的對象,即使沒有任何Direct Reference,也不會清除,一直到jvm內存不足且沒有Direct Reference時候才會清除。
應用場景:常用來設計緩存,不但可以將對象緩存起來,也不會容易造成內存不足。
2、Weak Reference(弱引用)
GC一旦發(fā)現(xiàn)了弱引用關系進行就開始收集對象。
應用場景:想查看某些對象信息,又不想影響GC對其的收集工作。
與GC的交互:
1.將referent置為null引用;
2.將堆中的目標對象設置為“finalizable(可結束的)”;
3.先執(zhí)行finalize(),釋放內存,軟引用添加到RefernceQueue中。
ReferenceQueue在 soft renference和 weak reference中可以為null,但虛應用中必須有!
3、PhantomReference(虛引用)
與GC的交互:
1.不將referent置為null引用;而是將堆中的目標對象設置為“finalizable(可結束的)”;
2.先軟引用添加到RefernceQueue中。然后收集對象,釋放內存
附注:ReferenceQueue在 soft renference和 weak reference中可以為null,但虛引用中必須有!
4、抽象類Reference分析
java.lang.ref包中有四個類,他們的關系是PhantomReference,WeakReference,SoftReference繼承了抽象類Reference。Reference類中,有thread子類(ReferenceHandler),并在靜態(tài)區(qū)域中開啟,對pending字段進行實時的監(jiān)控。
pending是由jvm來賦值的,當Reference內部的referent對象的可達狀態(tài)改變時,jvm會將Reference對象放入pending鏈表。
一旦relevent= null,垃圾收集時會標記WeakReference的referent為不可達get()返回null,并且通過賦值給pending ,觸發(fā)ReferenceHandler線程處理pending。
ReferenceHandler線程要做的是將pending對象enqueue,但默認我們所提供的queue,也就是從構造函數(shù)傳入的是null,實際是使用了ReferenceQueue.NULL,Handler線程判斷queue為ReferenceQueue.NULL則不進行操作,只有非ReferenceQueue.NULL 的queue才會將Reference進行enqueue。
希望通過以上內容的介紹,能夠給你帶來幫助。