线上告警:P99 延迟从 80ms 飙升至 2000ms,每隔几分钟就有一次「毛刺」。排查了三天,最终发现罪魁祸首是 GC。这是一篇完整的 JVM 调优实战记录,从问题定位到参数调优,全程复盘。
事故现场
我们的实时推荐服务部署在 8 台 16C32G 的机器上,JDK 17,堆内存配置为 -Xmx12g -Xms12g,使用 G1 垃圾回收器。日均请求量 2 亿次,单机 QPS 约 3000。
某天凌晨,监控系统突然告警:
告警指标:
- P99 延迟:80ms → 2000ms(持续波动)
- GC 暂停时间:平均 500ms,峰值 3200ms
- Full GC 频率:每 3-5 分钟一次
- CPU 使用率:从 40% 飙升至 85%
用户侧的表现是:推荐列表偶尔加载极慢,页面出现空白等待。
第一步:收集 GC 日志
开启详细 GC 日志是所有调优工作的起点:
# JDK 17 的 GC 日志参数
-Xlog:gc*:file=/data/logs/gc.log:time,uptime,level,tags:filecount=10,filesize=50m
# 如果是 JDK 8(虽然很老了)
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/logs/gc.log
用 GCEasy 或 gchisto 分析日志后,问题一目了然: