Java引用類型的區別

注意:本文是對這篇文章的總結。

對比

四種引用的強度:強引用 -> 軟引用 -> 弱引用 -> 虛引用

引用類型 被垃圾回收條件 用途
強引用 從來不會 對象的一般狀態
軟引用 內存不足時 對象緩存
弱引用 被垃圾回收器發現時 對象緩存
虛引用 被垃圾回收器發現時 跟蹤對象的垃圾回收

詳細說明

軟引用、弱引用和虛引用的構造函數都可傳入引用隊列(ReferenceQueue),作用是當Reference 所引用的對象被回收後,Java 虛擬機會把這個 Reference 加入到 ReferenceQueue 隊列中。當referenceQueue.poll() 返回值不爲null,則說明對象已被回收。

1. 強引用(StrongReference)

這個沒什麼好說的

2. 軟引用(SoftReference)

當內存不足時,SoftReference 所引用的對象會被垃圾回收器回收;回收器會優先回收長時間閒置不用的軟引用對象。

軟引用可用來實現內存敏感的高速緩存。

SoftReference<Object> softReference = new SoftReference<>(new Object());
//或
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
SoftReference<Object> softReference = new SoftReference<>(new Object(), referenceQueue);
// 如果 reference != null, 則對象已被回收;此時 reference 即爲 softReference 
Reference<?> reference = referenceQueue.poll();

3. 弱引用(WeakReference)

當垃圾回收器發現一個對象只有弱引用時,即會被回收,不管當前是否內存不足。
軟引用與弱引用的區別在於軟引用只有在內存不足時纔可能被回收,而弱引用隨時都可能被回收。

4. 虛引用(PhantomReference)

如果一個對象只被虛引用,那麼它和沒有任何引用一樣。
主要用於跟蹤對象被垃圾回收器回收的活動,所以虛引用必須與引用隊列(ReferenceQueue)聯合使用。當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會在回收前把這個虛引用加入到與之關聯的引用隊列中。

PhantomReference<Object> phantomReference = 
                new PhantomReference<>(new Object(), new ReferenceQueue<Object>());
// 這個返回值等於 null
Object o = phantomReference.get();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章