1. 程式人生 > >Java中的強引用,軟引用,弱引用,虛引用

Java中的強引用,軟引用,弱引用,虛引用

作者:winterSunshine
連結:https://www.zhihu.com/question/37401125/answer/100981172
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

1.概念解釋
  • 強引用是使用最普遍的引用:Object o=new Object(); 特點:不會被GC
    • 將物件的引用顯示地置為null:o=null; // 幫助垃圾收集器回收此物件
    • 舉例ArrayList的實現原始碼:<img src="https://pic2.zhimg.com/50/dd6f826c4e0c045f3701978f311636e1_hd.jpg" data-rawwidth="361" data-rawheight="159" class="content_image" width="361">

  • 軟引用用來描述一些還有用但是並非必須的物件,在Java中用java.lang.ref.SoftReference類來表示。對於軟引用關聯著的物件,只有在記憶體不足的時候JVM才會回收該物件。因此,這一點可以很好地用來解決OOM的問題,並且這個特性很適合用來實現快取:比如網頁快取、圖片快取等。
    1. 瀏覽器網頁快取例項:

    2. 軟引用可以和一個引用佇列(ReferenceQueue)聯合使用,如果軟引用所引用的物件被垃圾回收器回收,Java虛擬機器就會把這個軟引用加入到與之關聯的引用佇列中。

  • 弱引用與軟引用的區別在於:只具有弱引用的物件擁有更短暫的生命週期。在垃圾回收器執行緒掃描它所管轄的記憶體區域的過程中,一旦發現了只具有弱引用的物件,不管當前記憶體空間足夠與否,都會回收它的記憶體。不過,由於垃圾回收器是一個優先順序很低的執行緒,因此不一定會很快發現那些只具有弱引用的物件。
如果這個物件是偶爾的使用,並且希望在使用時隨時就能獲取到,但又不想影響此物件的垃圾收集,那麼你應該用 Weak Reference 來記住此物件。
  1. 例項:<img src="https://pic4.zhimg.com/50/5000607cf6d43abd0533624cadea18bb_hd.jpg" data-rawwidth="743" data-rawheight="463" class="origin_image zh-lightbox-thumb" width="743" data-original="https://pic4.zhimg.com/5000607cf6d43abd0533624cadea18bb_r.jpg">

  • 虛引用也稱為幻影引用:一個物件是都有虛引用的存在都不會對生存時間都構成影響,也無法通過虛引用來獲取對一個物件的真實引用。唯一的用處:能在物件被GC時收到系統通知,JAVA中用PhantomReference來實現虛引用。
2.對比不同: