1. 引用類型及其特點
強引用(Strong Reference):
- 定義:最常見的引用類型,通過new關鍵字直接創建。
- 回收條件:只要強引用存在,對象不會被GC回收。
- 示例:
Object obj = new Object(); // 強引用
- 特點:
- 強引用是導致內存泄漏的常見原因(如未及時置為
null
)。 - 手動斷開引用:
obj = null;
。
- 強引用是導致內存泄漏的常見原因(如未及時置為
軟引用(Soft Reference):
- 定義:相對強引用弱化了一些的引用。通過
SoftReference
類實現,用于描述可有可無的對象。 - 回收條件:只有在 JVM 認為內存不足時,才會試圖回收軟引用指向的對象。JVM 會確保在拋出
OutOfMemoryError
之前,清理軟引用指向的對象。 - 應用場景:內存敏感的緩存(如圖片緩存、計算結果緩存)。如果還有空閑內存,可以暫時保留緩存,當內存不足時清理掉,避免耗盡內存。
- 示例:
SoftReference<byte[]> softRef = new SoftReference<>(new byte[1024 * 1024]); byte[] data = softRef.get(); // 可能返回null(若已被回收)
- 特點:
- 適合保存非必須但有用的數據,避免頻繁重建。
- 可通過
ReferenceQueue
追蹤被回收的對象。
弱引用(Weak Reference):
- 定義:通過
WeakReference
類實現,比軟引用更弱。不能使對象豁免垃圾收集,僅提供一種訪問在弱引用狀態下對象的途徑。 - 回收條件:垃圾收集器在掃描時,無論內存是否充足,一旦發生GC,對象就會被回收。
- 適用場景:非強制性的映射關系和緩存實現。例如,維護一種沒有特定約束的關系,如果試圖獲取時對象還在,就使用它,否則重現實例化(如
WeakHashMap
中的鍵)。 - 示例:
WeakReference<Object></