HotSpot GC 體系概覽
JVM 規範未強制 GC 實現,HotSpot 提供多款收集器組合,按代劃分:新生代(Serial、ParNew、Parallel Scavenge)、老年代(Serial Old、Parallel Old、CMS、G1)。收集器間連線表示可搭配使用。

新生代收集器
Serial Collector
- 單線程、複製算法、Stop-The-World
- 優點:無線程交互開銷,單 CPU 環境最高效
- 適用:Client 模式、單核、嵌入式場景
ParNew Collector
- Serial 多線程版,複製算法
- 唯一除 Serial 外能與 CMS 搭配的新生代收集器
- 參數:
-XX:+UseParNewGC
Parallel Scavenge Collector
- 多線程、複製算法,關注吞吐量
- 吞吐量 = 用戶代碼時間 / (用戶代碼時間 + GC 時間)
- 自適應調節:
-XX:+UseAdaptiveSizePolicy 自動調整堆區大小
- 控制參數:
-XX:MaxGCPauseMillis(最大停頓)、-XX:GCTimeRatio(吞吐量目標)
- 適用:後台批處理、科學計算、無交互業務
老年代收集器
Serial Old
- 單線程、標記-整理算法
- 用途:JDK 1.5 前與 Parallel Scavenge 搭配;CMS 失敗後備方案
Parallel Old
- Parallel Scavenge 老年代版,多線程、標記-整理
- 組合
Parallel Scavenge + Parallel Old:吞吐量優先首選
- 參數:
-XX:+UseParallelOldGC
CMS (Concurrent Mark Sweep)
- 目標:最短停頓時間,基於標記-清除算法
- 四階段:初始標記(STW) → 並發標記 → 重新標記(STW) → 並發清除
- 優點:用戶線程並發執行,低延遲
- 缺點:
- CPU 敏感,佔用核心資源
- 浮動垃圾導致 Concurrent Mode Failure 觸發 Full GC
- 內存碎片,需
-XX:+UseCMSCompactAtFullCollection 整理
- 參數:
-XX:+UseConcMarkSweepGC
G1 (Garbage-First)
- 面向服務端,JDK 9+ 默認收集器
- 特性:
- 並行並發:多 CPU 縮短 STW
- 分代收集:保留新/老年代邏輯,但物理不連續
- 空間整合:整體標記-整理,局部複製,無碎片
- 可預測停頓:指定
-XX:MaxGCPauseMillis,建立時間模型
- 堆劃分為多個等大 Region,新/老年代為 Region 集合
- Remembered Set (RSet) 記錄跨 Region 引用,避免全堆掃描
- 四階段:初始標記(STW) → 並發標記 → 最終標記(STW) → 篩選回收(可並發)
- 參數:
-XX:+UseG1GC
收集器選型指南
| 場景 | 推薦組合 | JVM 參數 |
| 單核/小內存/Client | Serial + Serial Old | -XX:+UseSerialGC |
| 多核/高吞吐/批處理 | Parallel Scavenge + Parallel Old | -XX:+UseParallelGC |
| 多核/低延遲/交互應用 | ParNew + CMS | -XX:+UseConcMarkSweepGC |
| 大內存(>6G)/低延遲/可預測 | G1 | -XX:+UseG1GC |
核心概念補充
- Stop-The-World:所有工作線程暫停,只有 GC 線程運行
- 安全點:線程可安全暫停的位置(方法調用、循環跳轉、異常跳轉)
- 安全區域:代碼片段中引用關係不變,可安全 GC(如睡眠、阻塞)
- 記憶集/卡表:老年代→新生代引用記錄,Young GC 時掃描卡表而非全老年代