系列第二篇,系統講解 Java 四種引用類型(強/軟/弱/虛)的語義差異、GC 處理流程、ReferenceQueue 通知機制,並給出代碼示例演示弱引用 + 佇列的實際運作。
| 引用類型 | 類別 | GC 回收時機 | 典型用途 | 生命週期控制力 |
| 強引用 | 預設 | 從不(寧願 OOM) | 一般物件持有 | 最強 |
| 軟引用 | SoftReference | 記憶體不足前 | 記憶體敏感緩存 | 中 |
| 弱引用 | WeakReference | 下次 GC 時 | 規範化映射、監聽器緩存 | 弱 |
| 虛引用 | PhantomReference | 回收前瞬間 | 預銷毀清理、直接記憶體釋放 | 最弱(不可單獨獲取物件) |
GC 處理流程細節
A. 強引用
GC 絕不回收,寧願拋 OutOfMemoryError。
B. 軟引用
- GC 發現僅有軟引用 → 將
SoftReference.referent 設為 null。
- 關聯物件標記為
finalizable。
finalize() 執行完、記憶體釋放後 → SoftReference 入隊 ReferenceQueue(若存在)。
GC 一般情況不掃描軟引用,僅在記憶體明顯不足時觸發。
C. 弱引用
- GC 發現僅有弱引用 →
WeakReference.referent = null。
- 物件標記
finalizable。
finalize() 後 → WeakReference 入隊 ReferenceQueue。
可能需多次 GC 才發現並回收弱引用物件。
D. 虛引用
- 物件標記
finalizable。
- 物件記憶體釋放前 →
PhantomReference 入隊 ReferenceQueue。
關鍵差異:虛引用入隊時物件記憶體尚未釋放,仍可訪問(需配合 ReferenceQueue 實現預清理)。
代碼示例:弱引用 + ReferenceQueue 運作觀察
String str = new String("hello"); // ① 強引用
ReferenceQueue rq = new ReferenceQueue<>(); // ② 佇列
WeakReference wr = new WeakReference<>(str, rq); // ③ 弱引用關聯佇列
str = null; // ④ 切斷強引用
String str1 = wr.get(); // ⑤ 若未回收,獲取物件
Reference extends String> ref = rq.poll(); // ⑥ 若已回收,佇列返回 Reference
// 狀態對照:
// 未回收:str1="hello", ref=null
// 已回收:str1=null, ref=WeakReference 物件(但 ref.get() 為 null)
引用機制與複雜資料結構聯合應用
- SoftReference + HashMap → 記憶體敏感緩存(如圖片、查詢結果),記憶體緊張自動釋放。
- WeakReference + HashMap →
WeakHashMap,Key 為弱引用,Key 無強引用時自動移除條目,適用「生命週期長、重建成本低」場景。
- PhantomReference + ReferenceQueue → 直接記憶體管理、Native 資源釋放、對象復活監控。
WeakHashMap 原理速覽
// 內部 Entry 繼承 WeakReference
private static class Entry extends WeakReference implements Map.Entry {
V value;
Entry(K key, V value, ReferenceQueue q) { super(key, q); this.value = value; }
}
// get/put/size 等操作前先 processQueue() 清理已回收 Key 的條目
選型決策樹
需要緩存?
├─ 記憶體敏感、物件大、重建貴 → SoftReference
├─ Key 隨生命週期自動失效 → WeakReference (WeakHashMap)
├─ 需在物件銷毀前瞬間執行清理 → PhantomReference + ReferenceQueue
└─ 普通場景 → 強引用 (HashMap/ConcurrentHashMap)
- 上一篇文章: Java 記憶體洩漏解決方案(三):SoftHashMap 源碼深度解析與 Reference 機制實戰</x2ID>
<xTitle>Java 記憶體洩漏解決方案(三):SoftHashMap 源碼深度解析與 Reference 機制實戰
- 下一篇文章: Java 記憶體洩漏解決方案(一):記憶體管理機制、洩漏成因、一般避免原則與複雜結構應對
Copyright ©
程式碼之家 All Rights Reserved