垃圾收集(GC)是 JVM 自動記憶體管理的核心。本文系統梳理三大經典算法、分代收集理論、主流收集器組合,重點剖析 G1 收集器原理與調優參數,助你根據應用特徵選擇最優 GC 方案。
| 算法 | 核心思想 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| 標記-清除 (Mark-Sweep) | 標記存活對象,統一清除未標記區域 | 實現簡單,無需移動對象 | 1. 效率低(雙掃描) 2. 產生記憶體碎片 | 老年代(配合壓縮) |
| 複製 (Copying) | 劃分兩塊等大區域,每次用一塊,存活對象複製到另一塊,清空已用區 | 無碎片,分配只需移動指針,極快 | 浪費 50% 空間;存活率高時複製開銷大 | 新生代(存活率低) |
| 標記-整理 (Mark-Compact) | 標記後,存活對象向一端移動,清理邊界外記憶體 | 無碎片,空間利用率高 | 需移動對象、更新引用,耗時較長 | 老年代 |

核心假設:絕大多數對象「朝生夕死」,只有少量長期存活。

目標:替代 CMS,兼顧吞吐與低延遲,支援可預測停頓模型。

-XX:MaxGCPauseMillis=N,G1 動態調整回收集合(CSet)大小以滿足目標。GC pause (young) (initial-mark)


| 組合 | 新生代 | 老年代 | 特點 | 適用場景 |
|---|---|---|---|---|
| Serial | Serial | Serial Old | 單線程,開銷最小 | Client 模式、單核、嵌入式 |
| ParNew + CMS | ParNew | CMS | 低延遲,並發收集老年代 | 舊版高併發 Web、響應敏感應用 |
| Parallel Scavenge + Parallel Old | Parallel | Parallel Old | 吞吐優先,多線程並行 | 批處理、科學計算、後台任務 |
| G1 | G1 Young | G1 Old/Mixed | 區域化、可預測停頓、大堆友好 | JDK 9+ 默認,6GB+ 堆、低延遲要求 |
| ZGC / Shenandoah | - | - | 亞毫秒級停頓,彩色指針/連接矩陣 | 超大堆(TB 級)、極致低延遲(JDK 11+) |
-XX:+UseParallelGC-XX:+UseG1GC -XX:MaxGCPauseMillis=100-XX:+UseZGC(JDK 11+)或 -XX:+UseShenandoahGCSystem.gc():信任收集器決策,必要時用 -XX:+DisableExplicitGC。-Xlog:gc*)。