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/