线上JAVA项目内存飙升如何排查?

1.首先通过top命令查看,通过 shift + m 做一个排序,查到进程号是23762

2.将堆得转存文件导出来

[zhupengfei@devops-rocky84-shanghai-area1 ~]$ jmap -dump:format=b,file=heap.hprof 23762 # jmap 跟二进制格式 + 文件名字 + pid

3.分析堆得文件

[zhupengfei@devops-rocky84-shanghai-area1 ~]$ sz heap.hprof # 下载到本地用 Ecliipse Memory Analyer 工具进行分析,简称MAT

打开之后会展示泄lou的怀疑报告,通过这个报告可以看到:

The class "com.ponfey.task.Task",loaded by
"org.springfamework.boot.loader.LaunchedURLClassLoader @ 0xe121eld8",
occuples 471,883,048(98.03%)bytes.The menmory is accumulated in one instance of
"Java.lang.Object[]",loaded by"<system class loader>",which occuples 471,883,048(98.03%)bytes.
...

  spingboot 用了这个类加载器去加载,占了98.03%的内存,内存累计在"Java.lang.Object[]"实例里面,这些内存的使用是堆积在这个里面的,通过系统类加载器去加载的,可能这个类里面有问题。

生产不建议使用jmap,非常占用内存。

上一篇
下一篇