先來簡要說一下這四種引用的特性: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