G1核心知识点解析

174 阅读4分钟

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:核心优势

特性G1CMS
内存布局Region化,无物理分代连续分代(Young/Old)
碎片处理通过Compaction减少碎片不压缩,长时间运行后可能Full GC
停顿时间可控(软实时)不可控,尤其并发模式失败时
回收范围全堆回收(Mixed GC)仅老年代
预测模型基于Region价值优先回收
大内存适应性更优(默认适合4GB+堆)适合中小堆(<4GB)

CMS痛点解决

  1. 内存碎片:CMS在长时间运行后可能触发Full GC(单线程STW压缩),而G1通过Mixed GC逐步压缩。
  2. 停顿时间不可控: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等机制,在可控停顿时间内实现高效回收,尤其适合大内存和低延迟场景。调优需关注MaxGCPauseMillisIHOPRegionSize等参数,结合GC日志工具(如-Xlog:gc*)分析实际停顿时间和吞吐量,逐步逼近最优配置。