首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 記憶體洩漏解決方案(二):四大引用類型、GC 交互細節與 ReferenceQueue 實戰

     編輯:Java 相關知識

系列第二篇,系統講解 Java 四種引用類型(強/軟/弱/虛)的語義差異、GC 處理流程、ReferenceQueue 通知機制,並給出代碼示例演示弱引用 + 佇列的實際運作。

四大引用類型語義對比

GC 處理流程細節

A. 強引用

GC 絕不回收,寧願拋 OutOfMemoryError。

B. 軟引用

  1. GC 發現僅有軟引用 → 將 SoftReference.referent 設為 null。
  2. 關聯物件標記為 finalizable。
  3. finalize() 執行完、記憶體釋放後 → SoftReference 入隊 ReferenceQueue(若存在)。
GC 一般情況不掃描軟引用,僅在記憶體明顯不足時觸發。

C. 弱引用

  1. GC 發現僅有弱引用 → WeakReference.referent = null。
  2. 物件標記 finalizable。
  3. finalize() 後 → WeakReference 入隊 ReferenceQueue。
可能需多次 GC 才發現並回收弱引用物件。

D. 虛引用

  1. 物件標記 finalizable。
  2. 物件記憶體釋放前 → 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 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)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
引用類型類別GC 回收時機典型用途生命週期控制力
強引用預設從不(寧願 OOM)一般物件持有最強
軟引用SoftReference記憶體不足前記憶體敏感緩存中
弱引用WeakReference下次 GC 時規範化映射、監聽器緩存弱
虛引用PhantomReference回收前瞬間預銷毀清理、直接記憶體釋放最弱(不可單獨獲取物件)