java-gc

Java GC 频繁或停顿过长的定位

现象

接口延迟尖刺、吞吐下降,GC 日志显示频繁 Young/Full GC,STW 停顿变长;CPU 使用率升高但业务吞吐不增。

快速定位

jstat -gcutil <pid> 1000 10
jcmd <pid> GC.heap_info
jcmd <pid> GC.class_histogram | head -30
jcmd <pid> VM.flags

GC 日志(JDK 9+):

java -Xlog:gc*:file=gc.log:time,uptime,level,tags -jar app.jar

常见根因

  1. 堆太小,频繁 Young GC;堆太大,Full GC 停顿长。
  2. 分配速率过高,短命对象过多。
  3. 老年代对象增长快或存在泄漏。
  4. 大对象/ humongous 对象导致特殊 GC 行为。
  5. GC 收集器选择不适合当前延迟/吞吐目标。
  6. 容器 CPU limit 导致 GC 线程不足。

修复

相关命令