年轻代晋升异常故障排查与JVM分代调优实践
【摘要】 生产环境某交易服务偶发Full GC,非大促高峰期触发,GC日志显示YGC后老年代内存持续增长,排查发现为年轻代Survivor区配置过小导致对象提前晋升。
生产故障现象
服务默认JVM配置为Xms4g Xmx4g Xmn4g XX:SurvivorRatio=8,即年轻代总大小4g,两个Survivor区各200m,Eden区400m。GC日志统计显示,YGC后老年代内...
生产环境某交易服务偶发Full GC,非大促高峰期触发,GC日志显示YGC后老年代内存持续增长,排查发现为年轻代Survivor区配置过小导致对象提前晋升。
生产故障现象
服务默认JVM配置为-Xms4g -Xmx4g -Xmn4g -XX:SurvivorRatio=8,即年轻代总大小4g,两个Survivor区各200m,Eden区400m。GC日志统计显示,YGC后老年代内存每次增长50-100m,Full GC频率从每月1-2次升至每周3-4次,峰值响应时间从200ms升至1.2s。
排查与调优过程
通过jstat -gcutil pid 1000观测YGC后老年代内存增长趋势,结合jmap -histo:live pid dump的堆信息,发现存在一批每次YGC后存活的请求上下文对象,生命周期约3-5次YGC,因Survivor区仅200m无法容纳,直接晋升到老年代。
调整Survivor区大小,将SurvivorRatio改为4,即两个Survivor区各285m,Eden区570m,年轻代总大小保持不变。调整后观测2周,YGC后老年代内存增长消失,Full GC频率恢复至每月1次左右。
也可通过增大年轻代总大小或调整晋升阈值解决,配置示例如下:
# 调整前后配置对比
# 旧配置
-Xmn4g -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15
# 新配置
-Xmn4g -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=15
需注意年轻代总大小不宜超过堆内存的50%,避免YGC停顿时间过长影响服务响应。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)