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

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

  • 強引用:若是一個對象具備強引用,那垃圾回收器毫不會回收它
  • 軟引用:若是一個對象只具備軟引用,則內存空間足夠,垃圾回收器就不會回收它
  • 弱引用:在垃圾回收器線程掃描它所管轄的內存區域的過程當中,一旦發現了只具備弱引用的對象,無論當前內存空間足夠與否,都會回收它的內存。
  • 虛引用:若是一個對象僅持有虛引用,那麼它就和沒有任何引用同樣,在任什麼時候候均可能被垃圾回收器回收。

強引用:

好比咱們這樣定義一個對象 算法

Object o=new Object();

當內存空間不足,Java虛擬機寧願拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具備強引用的對象來解決內存不足的問題。緩存

 顯式地設置o爲null,或超出對象的生命週期範圍,則gc認爲該對象不存在引用,這時就能夠回收這個對象。具體何時收集這要取決於gc的算法。spa

軟引用:

若是內存空間不足了,就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就能夠被程序使用。軟引用可用來實現內存敏感的高速緩存。  線程

軟引用能夠和一個引用隊列(ReferenceQueue)聯合使用,若是軟引用所引用的對象被垃圾回收器回收,Java虛擬機就會把這個軟引用加入到與之關聯的引用隊列中。3d

弱引用:

在垃圾回收器線程掃描它所管轄的內存區域的過程當中,一旦發現了只具備弱引用的對象,無論當前內存空間足夠與否,都會回收它的內存。htm

弱引用能夠和一個引用隊列(ReferenceQueue)聯合使用,若是弱引用所引用的對象被垃圾回收,Java虛擬機就會把這個弱引用加入到與之關聯的引用隊列中。對象

虛引用:

虛引用主要用來跟蹤對象被垃圾回收器回收的活動。虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用隊列 (ReferenceQueue)聯合使用。當垃圾回收器準備回收一個對象時,若是發現它還有虛引用,就會在回收對象的內存以前,把這個虛引用加入到與之 關聯的引用隊列中。blog

虛引用和引用隊列 (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/fengbs/p/7019687.html

相關文章
相關標籤/搜索