目錄
-
簡介
-
G1 GC 的設計目標
-
內存結構
-
回收過程
- 初始標記(Initial Mark)
- 并發標記(Concurrent Mark)
- 最終標記(Final Mark / Remark)
- 篩選回收(Cleanup / Evacuation)
-
混合回收(Mixed GC)
-
與其他 GC 的比較
-
優缺點
-
調優建議
-
總結
簡介
G1(Garbage-First)是一種服務于 多核、大內存、低延遲 應用場景的 服務器端垃圾收集器,自 JDK 9 起成為默認 GC。其主要目標是以可預測的停頓時間來實現高吞吐量。
G1 GC 的設計目標
- 可預測的 GC 停頓時間(如
<200ms
) - 減少 Full GC 的頻率
- 高吞吐量與低延遲的平衡
- 并行與并發執行,提高 CPU 利用率
內存結構
G1 GC 將堆劃分為多個等大小的 Region(區域),每個 Region 大小為 1MB 到 32MB(默認 4MB),總數不超過 2048。
- 年輕代(Young Generation):包含 Eden 和 Survivor 區域,分布在多個 Region 中
- 老年代(Old Generation):由存活對象多次晉升后形成
- Humongous Region:用于存放大對象(大于一個 Region 的一半)
+------------------------------------------------------+
| Java Heap |
| +-----------+ +-----------+ +-----------+ |
| | Eden | | Survivor | | Old Gen | ... |
| | Region | | Region | | Region | |
| +-----------+ +-----------+ +-----------+ |
+------------------------------------------------------+
回收過程
G1 的 GC 過程主要分為以下階段:
初始標記(Initial Mark)
- 標記從 GC Roots 可達的對象
- 只處理 Eden 區中的新對象引用
- 與 Minor GC 一起發生(STW)
并發標記(Concurrent Mark)
- 并發執行,不會暫停應用線程
- 遍歷整個堆中的對象圖,識別存活對象
- 構建每個 Region 的存活率統計信息
最終標記(Final Mark / Remark)
- STW 階段
- 補充并發標記過程中遺漏的變更
- 采用 SATB(Snapshot-At-The-Beginning)寫屏障
篩選回收(Cleanup / Evacuation)
- 選出回收價值高的 Region 進行回收(依據回收成本與收益)
- 將存活對象移動(Evacuation)到其他 Region
- 回收原 Region,形成空 Region
混合回收(Mixed GC)
在 Full GC 之前,G1 會執行 Mixed GC:
- 回收部分 Old Region + 所有 Young Region
- 并非一次完成,分多次 Mixed GC 執行,降低單次停頓時間
- 策略性選擇回收的 Old Region
與其他 GC 的比較
特性 | CMS | G1 GC | ZGC/ Shenandoah |
---|---|---|---|
并發標記 | 有 | 有 | 有 |
并發清理 | 有 | 有(只處理部分 Region) | 有 |
Region 化 | 否(分代) | 是(統一 Region) | 是 |
停頓時間 | 不可預測 | 可預測 | 極低停頓 |
吞吐量 | 高 | 高 | 中 |
優化目標 | 響應性 | 響應性 + 吞吐量 | 極低延遲 |
優缺點
優點
- 可預測的 GC 停頓時間
- 更高的并發度與吞吐量
- 減少 Full GC 發生頻率
- 自動調整回收策略
缺點
- 配置復雜度略高
- 對大對象的處理仍不理想(Humongous Objects)
- 初期占用 CPU 多,可能影響響應性
調優建議
-
設置最大停頓時間目標:
-XX:MaxGCPauseMillis=200
-
啟用 G1 GC:
-XX:+UseG1GC
-
控制堆內存大小:
-Xms4g -Xmx4g
-
限制 Humongous 對象產生,使用對象池
-
監控指標:
gc.pause
gc.alloc.rate
gc.live.data.size
gc.heap.size
總結
G1 GC 是一款結合了 吞吐量、低延遲、可預測停頓 特性的現代垃圾回收器,非常適合服務端、大型 Java 應用。它通過 Region 化設計、分階段回收與混合策略,達成了響應性和高效性的平衡。
在對 GC 行為有更高可控需求的場景下,G1 是比 CMS 更優秀的選擇。