Java 垃圾收集器 (GC) 是 JVM 自動內存管理的核心。本文從 GC 根節點枚舉、安全點/安全區域、記憶屏障、收集器分類、交互協作五個維度,系統梳理 GC 核心機制與收集器間協作原理。
| 概念 | 說明 |
|---|---|
| 安全點 | 代碼執行到特定位置(方法調用、循環跳轉、異常跳轉)時,線程可安全暫停,GC 掃描棧帧。JVM 通過輪詢或中斷信號讓線程主動進入安全點。 |
| 安全區域 | 代碼片段中引用關係不變的區域(如睡眠、阻塞、JNI 關鍵區)。線程進入時標記,GC 期間無需掃描其棧,退出時檢查是否需補掃。 |
關鍵:Stop-the-World (STW) 時刻所有線程必須在安全點/區域,才能進行 Roots 枚舉與堆遍歷。
| 收集器 | 代別 | 算法 | 併發度 | 適用場景 |
|---|---|---|---|---|
| Serial | 新/老 | 複製/標整 | 串行 STW | Client 模式、小堆、單核 |
| ParNew | 新 | 複製 | 多線程 STW | 配合 CMS、多核新生代 |
| Parallel Scavenge | 新 | 複製 | 多線程 STW | 吞吐量優先、科學計算 |
| CMS | 老 | 標清 | 併發標記/清除 | 低延遲、舊版主流(JDK 9 棄用) |
| G1 | 全堆 | 標整+複製 | 併發標記、混合收集 | 大堆 (>4G)、可預測停頓、JDK 9+ 默認 |
| ZGC | 全堆 | 染色指標+讀屏障 | 高度併發 | 超大堆 (TB 級)、亞毫秒停頓、JDK 11+ |
| Shenandoah | 全堆 | 併發移動+讀屏障 | 高度併發 | 大堆、低延遲、OpenJDK 項目 |
-XX:+UseParallelGC-XX:+UseG1GC (默認)-XX:+UseZGC (生產就緒)-Xms -Xmx 堆初始/最大
-XX:NewRatio 老年代/新生代比例
-XX:SurvivorRatio Eden/Survivor 比例
-XX:MaxGCPauseMillis G1/ZGC 目標停頓
-XX:+PrintGCDetails -Xlog:gc* GC 日誌 (JDK 9+ 統一格式)