1. 程式人生 > >java強引用,軟引用,弱引用和虛引用

java強引用,軟引用,弱引用和虛引用

開發十年,就只剩下這套架構體系了! >>>   

先來簡要說一下這四種引用的特性:

  • 強引用:如果一個物件具有強引用,那垃圾回收器絕不會回收它
  • 軟引用:如果一個物件只具有軟引用,則記憶體空間足夠,垃圾回收器就不會回收它
  • 弱引用:在垃圾回收器執行緒掃描它所管轄的記憶體區域的過程中,一旦發現了只具有弱引用的物件,不管當前記憶體空間足夠與否,都會回收它的記憶體。
  • 虛引用:如果一個物件僅持有虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收。

強引用:

比如我們這樣定義一個物件 

Object o=new Object();

當記憶體空間不足,Java虛擬機器寧願丟擲OutOfMemoryError錯誤,使程式異常終止,也不會靠隨意回收具有強引用的物件來解決記憶體不足的問題。

 顯式地設定o為null,或超出物件的生命週期範圍,則gc認為該物件不存在引用,這時就可以回收這個物件。具體什麼時候收集這要取決於gc的演算法。

軟引用:

如果記憶體空間不足了,就會回收這些物件的記憶體。只要垃圾回收器沒有回收它,該物件就可以被程式使用。軟引用可用來實現記憶體敏感的快取記憶體。  

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

弱引用:

在垃圾回收器執行緒掃描它所管轄的記憶體區域的過程中,一旦發現了只具有弱引用的物件,不管當前記憶體空間足夠與否,都會回收它的記憶體。

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

虛引用:

虛引用主要用來跟蹤物件被垃圾回收器回收的活動。虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用佇列 (ReferenceQueue)聯合使用。當垃圾回收器準備回收一個物件時,如果發現它還有虛引用,就會在回收物件的記憶體之前,把這個虛引用加入到與之 關聯的引用佇列中。

虛引用和引用佇列 (ReferenceQueue)聯合使用,直接呼叫get返回null。

下面的圖來自這個部落格(http://www.cnblogs.com/fengbs/p/7019687.html),看圖就比較直觀啦。

這些引用都是繼承抽象類Reference,有哪些方法就不細看啦。

然後我們看看這個包內都有什麼:

FinalReference: 代表強引用,但沒法直接使用。

Finalizer:FinalReference的子類,主要處理finalize相關的工作。

更深入的理解的內容可以看看參考的博文,裡面洗了更多的內容和程式碼可供參考

參考:

http://www.cnblogs.com/fengbs/p/7019687.html

https://www.cnblogs.com/