G1 调优参数与实战
G1 的调优核心是在停顿时间和吞吐量之间找到平衡。G1 的设计哲学是「软目标」——尽力满足停顿时间目标,但不会牺牲太多吞吐量。
理解 G1 的关键参数,是进行生产环境调优的基础。
核心参数
停顿时间控制
堆内存配置
新生代配置
GC 日志解读
开启 GC 日志
Young GC 日志
Mixed GC 日志
日志字段说明
常见问题与解决
问题一:停顿时间过长
如果停顿时间超过目标,可能原因:
- 新生代太大:新生代占用过多,导致 Young GC 时间长
- Mixed GC 清理的老年代 Region 太多:老年代垃圾过多
- Humongous 对象过多:大对象回收代价高
解决方案:
问题二:Full GC 频繁
G1 正常情况下不应该频繁 Full GC。如果出现 Full GC,可能原因:
- Humongous 对象分配过多:Humongous 对象只能在 Full GC 时回收
- 元空间不足:类加载器泄漏
- 晋升失败:Minor GC 时 Survivor 区空间不足
解决方案:
问题三:Mixed GC 时间过长
Mixed GC 会同时清理新生代和部分老年代 Region。如果 Mixed GC 时间过长,可能原因:
- 老年代垃圾过多:需要清理的 Region 太多
- 并发标记阶段失败:标记未完成就触发了 Mixed GC
解决方案:
调优步骤
第一步:确定目标
明确调优目标:
- 停顿时间目标:P99 延迟要求是多少?
- 吞吐量目标:业务对吞吐量要求有多高?
- 内存预算:可用堆内存是多少?
第二步:收集数据
第三步:分析瓶颈
分析 GC 日志和监控数据:
- 停顿时间是否达标?
- GC 频率是否可接受?
- 是 Young GC 还是 Mixed GC 导致的停顿?
第四步:调整参数
根据分析结果调整参数:
第五步:验证
调整参数后重新压测,验证效果。