G1(Garbage-First)垃圾回收器是JDK 7引入、JDK 9成为默认的面向服务端应用的垃圾回收器,其核心设计目标是低延迟和可预测的停顿时间。以下是G1的核心概念、与CMS的对比以及调优关键参数的详细解析:
一、G1核心概念
1. Region化内存布局
- G1将堆划分为多个大小相等(1MB~32MB,默认按堆大小自动计算)的Region,每个Region可以是Eden、Survivor或Old区。
- 优势:通过细粒度内存管理,避免传统分代模型中整代回收的延迟问题。
2. Remembered Set(RSet)
- 每个Region维护一个RSet,记录其他Region对当前Region内对象的引用。
- 作用:避免全堆扫描,快速定位跨Region引用(如Young GC时避免扫描整个老年代)。
3. SATB(Snapshot-At-The-Beginning)
- 在并发标记阶段,G1通过SATB算法记录标记开始时的对象快照。
- 优势:解决并发标记期间对象状态变化导致的漏标问题(如对象从存活变为垃圾)。
4. Evacuation与Compaction
- Evacuation(复制) :Young GC时存活对象复制到Survivor或Old Region。
- Compaction(压缩) :混合GC(Mixed GC)时选择性回收Old Region,减少内存碎片。
5. 停顿预测模型
- 基于Region的回收价值(回收后可释放的空间大小及回收所需时间)动态选择回收区域。
- 目标:在用户设定的
MaxGCPauseMillis(默认200ms)内尽可能回收更多垃圾。
二、G1 vs CMS:核心优势
| 特性 | G1 | CMS |
|---|---|---|
| 内存布局 | Region化,无物理分代 | 连续分代(Young/Old) |
| 碎片处理 | 通过Compaction减少碎片 | 不压缩,长时间运行后可能Full GC |
| 停顿时间 | 可控(软实时) | 不可控,尤其并发模式失败时 |
| 回收范围 | 全堆回收(Mixed GC) | 仅老年代 |
| 预测模型 | 基于Region价值优先回收 | 无 |
| 大内存适应性 | 更优(默认适合4GB+堆) | 适合中小堆(<4GB) |
CMS痛点解决
- 内存碎片:CMS在长时间运行后可能触发Full GC(单线程STW压缩),而G1通过Mixed GC逐步压缩。
- 停顿时间不可控:G1通过停顿预测模型动态调整回收量,CMS在并发阶段可能因应用线程速度不足导致“Concurrent Mode Failure”。
三、G1调优关键参数
1. 核心目标参数
-XX:MaxGCPauseMillis=200
预期最大停顿时间(非硬性保证),G1会动态调整回收区域数量。
效果:值越小,GC频率可能越高,单次回收区域越少。
2. 堆内存与Region
-XX:G1HeapRegionSize=N
手动设置Region大小(需为2的幂)。
注意:超大对象(>Region 50%)会分配到Humongous Region,Full GC时回收。
3. 并发与并行阶段
-XX:InitiatingHeapOccupancyPercent=45
触发并发标记的老年代占用阈值(默认45%)。
调优:过早触发(降低该值)可能增加Mixed GC次数;过晚触发(提高该值)可能引发Full GC。-XX:ConcGCThreads=N
并发标记阶段的线程数(默认≈ParallelGCThreads/4)。
平衡:过多影响应用线程,过少延长标记时间。
4. 年轻代与混合GC
-XX:G1NewSizePercent=5/-XX:G1MaxNewSizePercent=60
年轻代占比的上下限(默认5%~60%)。
场景:提高下限可减少Young GC频率(适合产生大量临时对象的应用)。-XX:G1MixedGCLiveThresholdPercent=85
混合GC时,存活对象占比低于此值的Old Region会被回收。
调优:降低该值可回收更多Region,但可能增加GC时间。
5. 线程数控制
-XX:ParallelGCThreads=N
STW阶段的并行线程数(默认≈CPU核数)。
建议:超线程下可设为物理核心数的75%~100%。
四、调优示例
场景:高吞吐量低延迟
bash
复制
java -XX:+UseG1GC \
-Xmx16g -Xms16g \
-XX:MaxGCPauseMillis=100 \
-XX:InitiatingHeapOccupancyPercent=35 \
-XX:ConcGCThreads=4 \
-XX:G1HeapRegionSize=8m \
-jar app.jar
- 效果:降低IHOP提前触发并发标记,增大Region减少Humongous对象分配,限制并发线程减少CPU争用。
五、总结
G1通过Region化内存、RSet、SATB等机制,在可控停顿时间内实现高效回收,尤其适合大内存和低延迟场景。调优需关注MaxGCPauseMillis、IHOP、RegionSize等参数,结合GC日志工具(如-Xlog:gc*)分析实际停顿时间和吞吐量,逐步逼近最优配置。