注意:本文是對這篇文章的總結。
對比
四種引用的強度:強引用 -> 軟引用 -> 弱引用 -> 虛引用
引用類型 | 被垃圾回收條件 | 用途 |
---|---|---|
強引用 | 從來不會 | 對象的一般狀態 |
軟引用 | 內存不足時 | 對象緩存 |
弱引用 | 被垃圾回收器發現時 | 對象緩存 |
虛引用 | 被垃圾回收器發現時 | 跟蹤對象的垃圾回收 |
詳細說明
軟引用、弱引用和虛引用的構造函數都可傳入引用隊列(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();