Skip to content

G1 GC

G1(Garbage First)是面向服务端的通用垃圾回收器。它把堆划分成多个 Region,根据回收收益选择区域,在吞吐和停顿之间取得平衡。现代服务端应用通常可以先从 G1 开始评估。

定位

维度说明
核心目标可控停顿和较好吞吐
内存模型Region 分区
回收类型Young GC、Mixed GC、Full GC
适合场景中大型服务端应用
关注点大对象、Mixed GC、停顿目标、并发周期

Region

G1 不把堆简单固定为连续的新生代和老年代,而是拆成很多 Region。Region 会被动态用作 Eden、Survivor、Old 或 Humongous。

text
Heap = Region + Region + Region + ...

G1 会优先回收垃圾比例高、收益更好的 Region。

回收过程

Young GC

回收年轻代 Region,应用线程暂停,存活对象复制到 Survivor 或 Old Region。

并发标记

当堆使用达到阈值,G1 开始并发标记,识别老年代中垃圾比例较高的 Region。

Mixed GC

同时回收年轻代和部分老年代 Region,目标是在停顿预算内获得较好回收收益。

Full GC

当 G1 无法及时回收或分配失败时可能退化到 Full GC。频繁 Full GC 说明需要排查配置、对象生命周期或容量。

常用参数

bash
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-Xms4g
-Xmx4g

MaxGCPauseMillis 是目标,不是硬保证。设置过低可能导致 GC 更频繁、吞吐下降。

常见辅助参数:

bash
-XX:InitiatingHeapOccupancyPercent=45
-XX:G1HeapRegionSize=8m

除非有明确证据,不建议一开始就调大量 G1 细节参数。

常见问题

Humongous 对象

大对象会占用 Humongous Region。大量大对象可能导致回收和分配压力。

排查:

  • 看 GC 日志中的 humongous 信息。
  • 检查大数组、大字符串、大 byte buffer。
  • 优化批量处理和文件读取方式。

Mixed GC 效果差

表现:

  • Mixed GC 频繁。
  • 老年代下降不明显。
  • Full GC 风险上升。

方向:

  • 分析对象存活率。
  • 检查缓存和长生命周期集合。
  • 不要只降低停顿目标。

观测

bash
-Xlog:gc*:file=gc.log:time,uptime,level,tags
jstat -gcutil <pid> 1000
jcmd <pid> GC.heap_info

重点看:

  • Young / Mixed / Full 次数。
  • 暂停时间。
  • 回收前后内存变化。
  • humongous 分配。
  • 并发标记是否来得及完成。

使用建议

  • 服务端新项目优先从 G1 基线开始。
  • 先设置堆大小和停顿目标,再根据日志微调。
  • 避免无界缓存和大对象批量堆积。
  • 如果 P999 延迟要求很苛刻,再评估 ZGC 或 Shenandoah。
别急,先让缓存热一下。