Appearance
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
-Xmx4gMaxGCPauseMillis 是目标,不是硬保证。设置过低可能导致 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。
