跳转至

线上 GC 问题快速定位

一、看现象

  • 接口慢。
  • CPU 高。
  • 接口超时。

二、第一步:看 GC 日志

-Xlog:gc*:file=gc.log

或者 JDK 8:

-XX:+PrintGCDetails -XX:+PrintGCDateStamps

看什么

  • GC 频率(Minor GC 每秒一次?)。
  • GC 停顿时间(超过 200ms?)。
  • Full GC 频率。
  • 老年代使用率。

三、jstat

jstat -gcutil <pid> 1000

看各区使用率、GC 次数、时间。

四、jmap dump

怀疑内存泄漏:

jmap -dump:format=b,file=heap.hprof <pid>

用 MAT 打开,找大对象。

五、Arthas

arthas
dashboard        # 实时看 GC
gc               # GC 统计
heapdump         # dump heap

六、常见问题

1. Minor GC 频繁

  • 年轻代太小。
  • 大对象直接进老年代。

2. Full GC 频繁

  • 老年代满。
  • 元空间满。
  • 大对象多。

3. 单次 GC 时间长

  • 堆太大。
  • 对象太多。

七、流程

现象 → jstat → GC 日志 → dump → MAT → 改代码/调参数。

不要慌

先看 GC 日志,大部分问题一目了然。