内存溢出和内存泄漏排查流程

内存溢出和内存泄漏排查流程

内存溢出和内存泄漏在 Java 项目中并不少见。本文讲排查流程和常见原因。

先看现象,不要急着改参数

JVM 问题常见现象有:CPU 飙高、频繁 Full GC、接口变慢、内存溢出。处理时先收集证据:

jps -l
top -Hp <pid>
jstat -gcutil <pid> 1000 10
jmap -histo <pid> | head -30

如果是 CPU 高,把线程 id 转成十六进制后,用 jstack 找对应线程:

printf '%x\n' <tid>
jstack <pid> | grep -A 30 '<hexTid>'

GC 日志怎么看

不要只看“发生了 GC”,重点看频率、停顿时间、回收前后内存变化。如果每次回收后老年代仍然很高,可能是对象长期被引用,需要继续分析堆。

小白可以怎么练

本地写一个不断往 List 里放对象的 demo,故意触发 OOM,然后用 jmap 导出堆文件,用 MAT 或 VisualVM 看最大对象是谁。练过一次,线上看到类似问题就不会慌。


   转载规则


《内存溢出和内存泄漏排查流程》 小乐 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录