G1 (Garbage-First) 垃圾回收器是 JDK 7 中 HotSpot VM 引入的重量級特性,旨在取代 CMS (Concurrent Mark Sweep) 成為低延遲、大堆場景下的首選收集器。Java SE 6 Update 14 已包含早期體驗版,經歷「收費誤會」風波後確認為完全免費。本文系統梳理 G1 的核心屬性、堆佈局創新、回收流程、關鍵啟動參數及已知限制,為生產環境評估與調優提供參考。
傳統收集器將堆劃分為連續的 Young/Old 區;G1 將整個堆劃分為大小相等(通常 1-32MB)的 Region,年輕代與年老代不再物理連續,而是由離散 Region 組成的邏輯集合。這帶來三大優勢:
| 參數 | 說明 | 示例 |
|---|---|---|
-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC | 啟用 G1(JDK 7 需解鎖實驗選項) | 必需 |
-XX:MaxGCPauseMillis | 目標最大停頓時間(毫秒),G1 動態調整回收集大小以滿足 | 50 |
-XX:GCPauseIntervalMillis | 目標停頓間隔(毫秒),控制 GC 頻率 | 200 |
-XX:G1YoungGenSize | 顯式設定年輕代大小,影響 Young GC 停頓 | 512m |
-XX:SurvivorRatio | Survivor 區與 Eden 區比例 | 6 |
-XX:+G1ParallelRSetUpdatingEnabled-XX:+G1ParallelRSetScanningEnabled | 並行更新/掃描 Remembered Set(可能暴露罕見競態,謹慎開啟) | 視情況 |
日誌建議:-XX:+PrintGCDetails 下 G1 輸出極其詳細(各線程耗時等),生產環境建議改用 -verbose:gc 獲取精簡日誌。
G1 以 Region 化堆佈局、標記整理壓縮、可預測停頓模型解決了 CMS 碎片化、停頓不可控等痛點,適合 大堆(>4GB)、低延遲敏感、多核服務端 應用。JDK 7 階段仍屬實驗性,生產環境建議充分壓測後謹慎上線;JDK 8/9 以降 G1 成為默認收集器並大幅增強穩定性,遷移成本大幅降低。