分代 GC 流程圖解

三大收集器深度對比
1. 串行收集器 (Serial GC)

- **單線程**完成所有 GC 工作,無線程切換開銷,單線程效率最高。
- **適用**:單核 CPU、小堆(~100MB)、Client 模式、無響應要求。
- 參數:
-XX:+UseSerialGC
2. 並行收集器 (Parallel Scavenge / Parallel Old)

- **多線程並行**回收新生代(Parallel Scavenge),JDK 6+ 支持老年代並行(Parallel Old)。
- **目標**:**最大吞吐量** = (用戶代碼時間) / (總時間)。
- **可控指標**:
-XX:MaxGCPauseMillis:目標最大停頓(自動調整堆結構)。
-XX:GCTimeRatio:吞吐量目標(默認 99 → 1% GC 時間)。
- **適用**:多核、批處理、科學計算、後台任務、無實時響應要求。
- 參數:
-XX:+UseParallelGC -XX:ParallelGCThreads=n
3. 並發收集器 (CMS - Concurrent Mark Sweep)

- **核心目標**:**最小化停頓時間**,大部分工作與應用線程**並發執行**。
- **流程**:初始標記(STW) → 並發標記 → 重新標記(STW) → 並發清除 → 並發重置。
- **代價**:
- 佔用 CPU 資源(並發階段佔 K/N 核心,通常 1≤K≤N/4)。
- **浮動垃圾**:並發期間新產生的垃圾只能下輪回收,需預留 20% 空間。
- **碎片**:標記-清除不壓縮,長期運行產生碎片 → 分配大對象失敗 → 觸發 **Concurrent Mode Failure** 退化為串行 Full GC(災難性停頓)。
- **啟動時機**:
-XX:CMSInitiatingOccupancyFraction 設置老年代佔用百分比觸發(默認自適應)。
- **適用**:Web 服務、API 閘道、電信交換、IDE——**響應時間敏感、多核、中大堆**。
- 參數:
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC
選型決策表
| 應用類型 | 推薦收集器 | 核心理由 |
|----------|------------|----------|
| 單核 / 小堆 / 測試 | Serial | 開銷最小 |
| 批處理 / 科學計算 / 後台任務 | **Parallel GC** | 吞吐量最高,多核並行 |
| Web / API / 即時系統 / 高併發服務 | **CMS / G1** | 停頓可控,用戶體驗優先 |
| 超大堆 (>8GB) / 混合負載 | **G1** | Region 級回收,停頓可預期 |
總結
- **沒有銀彈**,只有適合業務 SLA 的收集器。
- **先定 SLA**(最大停頓、吞吐量),再選收集器、調參數。
- **監控 GC 日志**,觀察實際停頓分佈、頻率、老年代增長趨勢,持續微調。