Java 中的引用類型決定了物件在垃圾回收 (GC) 時的存活策略。理解這四種引用的差異,對於記憶體管理、快取設計與避免記憶體洩漏至關重要。本文參考《深入理解 Java 虛擬機》整理如下:
最常見的引用方式,程式碼中普遍存在,例如 Object obj = new Object()。只要強引用存在,垃圾收集器永遠不會回收被引用的物件,即使記憶體不足拋出 OutOfMemoryError 也不會回收。
用於描述「還有用但非必需」的物件。在系統即將發生記憶體溢出前,會將這些物件列入回收範圍進行二次回收;若回收後仍不足記憶體,才會拋出 OutOfMemoryError。JDK 1.2 後提供 SoftReference 類別實現。適用場景:記憶體敏感的快取(如圖片快取、網頁快取)。
同樣描述非必需物件,但強度比軟引用更弱。只能存活到下一次垃圾收集器執行前;當 GC 工作時,無論記憶體是否充足,都會回收僅被弱引用關聯的物件。JDK 1.2 後提供 WeakReference 類別實現。適用場景:監聽器、回調、WeakHashMap 的鍵值對。
又稱幽靈引用或幻影引用,是最弱的引用關係。物件是否有虛引用存在,完全不影響其生存時間,也無法透過虛引用取得物件實例。唯一目的:在物件被垃圾收集器回收時收到一個系統通知。JDK 1.2 後提供 PhantomReference 類別實現。適用場景:追蹤物件回收時間、進行資源釋放(如直接記憶體釋放)。
—— 摘自《深入理解 Java 虛擬機》
總結對比表:
| 引用類型 | 回收時機 | 主要用途 | 對應類別 |
|---|---|---|---|
| 強引用 | 永不回收 | 一般物件持有 | 無 |
| 軟引用 | 記憶體不足前 | 快取 | SoftReference |
| 弱引用 | 下次 GC 時 | 弱關聯映射、監聽器 | WeakReference |
| 虛引用 | 回收時通知 | 資源釋放追蹤 | PhantomReference |