生产环境 Java 服务在流量突增后出现 Full GC 频繁、接口延迟升高,但堆使用率并未持续增长,如何定位问题并制定优化方案?
旗舰版来源:baidu中级工程师堆外内存排查业务指标关联分析JFR性能诊断GC日志分析
答案解析
我不会先简单地把 Xmx 调大,而是先确认 Full GC 的触发原因,以及接口延迟是否确实由 Stop The World 引起。堆使用率没有持续增长,只能说明某个时刻的存活对象总量没有明显上升,并不代表对象分配速率低,流量突增时很可能是短生命周期对象大量创建,堆被频繁填满后又被回收。
1. 先保留现场并确认 GC 类型
先确认 JDK 版本、垃圾收集器、容器 CPU 和内存限制,并查看 GC 日志、应用 QPS、接口 p99/p999、CPU、线程池队列、Full GC 次数和暂停时间。JDK 9 及以上可以开启类似下面的日志:
Xlog:gc ,safepoint=debug:file=/path/gc.log:time,uptime,level,tags:filecount=10,filesize=100M
重点看每次 Full GC 的触发原因、GC 前后的 Eden、Survivor、Old、Metaspace 和 Humongous 区域使用量。常见原因包括 System.gc()、Allocation Failure、`Promotio
登录后查看完整内容
