一文讀懂Java四種引用類型

 
Java中支持四種引用類型。平時我們可能只用到其中一種,但對各種引用類型都有一定了解是有必要的。
本文針對四種引用類型的含義特徵應用場景使用方式進行分析。

強引用

含義特徵

強引用(Strong Reference)
當我們使用new創建對象時,被創建的對象就是強引用。
例如Object object = new Object(),其中的object就是一個強引用了。
如果一個對象具有強引用,JVM在垃圾回收時就不會去回收它(GC它)。JVM寧可會報OOM(OutofMemoryError)來終止程序,也不回收該對象。
如果對JVM垃圾回收不太瞭解,傳送門:(之後補上)
如果對OOM不太瞭解,傳送門:(什麼是OOM?
 

應用場景

我們平時開發中用到的new命令就是在創建強引用,應用場景不言而喻~
 

使用方式

Object object = new Object();

  

軟引用

含義特徵

軟引用(Soft Reference)
如果一個對象只具備軟引用,如果內存空間足夠,那麼JVM就不會GC它,如果內存空間不足了,就會GC該對象。
 

應用場景

可以用來實現緩存。一般緩存是用來加速訪問的,但如果服務器有產生OOM的風險,就應該把緩存GC掉。
 

使用方式

SoftReference<Object> softReference = new SoftReference(new Object());
softReference.get();//獲取被軟引用的對象

  

弱引用

含義特徵

弱引用(Weak Reference)
如果一個對象只具有弱引用,只要JVM的GC線程檢測到了,就會立即回收。
弱引用的生命週期要比軟引用短很多。不過,如果垃圾回收器是一個優先級很低的線程,也不一定會很快就會釋放掉弱引用的內存。
 

應用場景

ThreadLocal就使用了弱引用,解決了當沒有強引用指向 ThreadLocal 變量時,ThreadLocal 不能被回收而造成的內存泄漏的問題。
傳送門:(ThreadLocal深入解析
 

使用方式

WeakReference<Object> weakReference = new WeakReference(new Object());
weakReference.get();//獲取被弱引用的對象

  

虛引用

含義特徵

虛引用(Phantom Reference)
如果一個對象只具有虛引用,那麼它就和沒有任何引用一樣,隨時會被JVM當作垃圾進行GC。 建立虛引用只是在被回收時發一個通知。無法通過虛引用來取得一個對象實例。
 

應用場景

有了虛引用的“通知機制”,我們就可以在所引用的對象的內存被回收之前採取必要的行動。
舉個具體的例子:
jdk中直接內存的回收就用到虛引用。由於jvm自動內存管理的範圍是堆內存,而直接內存是在堆內存之外,Java會在堆內存分配一個對象保存這個堆外內存的引用,這個對象被垃圾收集器管理,一旦這個對象被回收,相應的用戶線程會收到通知並對直接內存進行清理工作。

這裏補充一個tip:
直接內存:它不是虛擬機運行時數據區的一部分,也不是Java虛擬機規範中定義的內存區域。它是一種堆外內存,通過存儲在Java堆中的DirectByteBuffer對象作爲這塊內存的引用進行操作。
如果對虛擬機運行時數據區不太瞭解,傳送門:(JVM運行時數據區
 

使用方式

虛引用必須和引用隊列 (ReferenceQueue)聯合使用。當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會在回收對象的內存之前,把這個虛引用加入到與之關聯的引用隊列中。

ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> phantomReference = new PhantomReference(new Object(),queue);
phantomReference.get();//獲取被虛引用的對象。它一定返回null值,因爲無法通過虛引用來取得一個對象實例
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章