自動回收不再使用的 Java 對象佔用的堆內存。僅針對 new 建立、分配在堆上的對象。
JNI 呼叫 C/C++ 分配的內存、直接記憶體、Metaspace 等,**GC 不管**。需手動釋放或依賴 Cleaner/PhantomReference 輔助。
finalize()free())try-with-resources、AutoCloseable、Cleaner (Java 9+)內存充足時 JVM 可能**根本不觸發 GC**。不可在業務邏輯依賴 GC 行為(如鎖釋放、資源清理)。
每個對象有計數器,引用 +1,失去引用 -1,歸零即可回收。
致命缺陷:無法解決循環引用(A→B, B→A,計數器永不歸零)。
主流商用 VM (HotSpot, JRockit, V8, CLR) 全部採用。
GC Roots 包含:
過程:從 Roots 出發向下搜尋,走過的路徑 = 引用鏈。**無法到達 Roots 的對象 = 可回收**。完美解決循環引用。

| 演算法 | 原理 | 優點 | 缺點 | 應用 |
|---|---|---|---|---|
| 標記-清除 | 標記存活 → 清除未標記 | 實現簡單 | 產生大量記憶體碎片 | 老年代 (CMS 初期) |
| 複製 | 劃分兩塊,用完存活複製到另一塊,整塊清理 | 無碎片、分配指針碰撞極快 | 可用內存折半;存活多時複製開銷大 | 新生代 (Eden + S0/S1) |
| 標記-整理 | 標記存活 → 向一端移動 → 清理邊界外 | 無碎片、內存利用率高 | 需移動對象、更新引用,停頓長 | 老年代 (Parallel Old, G1 混合) |
| 分代收集 | 新生代用複製,老年代用標記-整理/標記-清除 | 針對對象存活特性優化 | 實現複雜 | 所有商用 VM |
Minor GC 清理新生代,Major/Full GC 清理老年代+元空間。
| 引用類型 | GC 行為 | 典型用途 |
|---|---|---|
| 強引用 | 永不回收 | 普通對象 Object o = new Object() |
| 軟引用 | 內存不足前回收 | 快取 |
| 弱引用 | 下次 GC 回收 | 緩存、ThreadLocalMap |
| 虛引用 | 任何時候可回收,需配合 ReferenceQueue | 直接記憶體釋放、Cleaner |
理解根搜尋判定存活、分代演算法權衡、finalize 不可靠、引用類型語義,是調優 GC、排查 OOM、設計快取的基石。實戰中優先選擇成熟收集器 (G1, ZGC, Shenandoah) 並配合業務特性調參,而非重造輪子。