Java 内存泄漏排查,新技能Get

151 阅读1分钟

1:新建一个SpringBoot项目

image.png

2:访问 localhost:8080/add

3:进到控制台执行 top 命令

  • 此时CPU已经达到了734.4%,CPU达到这么高要么就是有死循环,要么就是FGC次数太频繁

image.png

4:执行 jstat -gc 5385 1000

  • 每1s打印一次GC信息,这个程序才启动了几秒钟的时间,但是FGC已经有8次了,说明平均每1s就会发生一次FGC,这么多的 FULL GC,应该是内存泄漏没跑了

image.png

5:保存堆信息

  • 执行 jmap -dump:format=b,file=heap.log pid (pid就是java程序的pid)
  • 在当前目录下会有一个heap.log文件,重命名为heap.hprof

6:分析文件

  • 下载jprofile
  • 右键heap.hprof,用jprofile打开

7:分析结果

  • 可以看到com.coco.model.User这个类占用了大量的内存,引起内存泄漏的根源就是他了 image.png

  • 选择最大对象,我们可以看到具体引发内存泄漏的位置在哪

image.png