天天看点

内存泄漏排查分析

首先来看下堆内存的情况:jmap -heap pid

内存泄漏排查分析

 我们可以看到老年代的空间基本都占满了。

由于可以看到老年代空间基本都满了,所以可以想到现在程序肯定在疯狂的进行GC操作,我们执行下命令看看:jstat -gc pid 1000

内存泄漏排查分析

 可以看出fullGC非常频繁,但是老年代的空间却并没减少,应该是发生了内存泄漏。

我们导出下dump日志看看,执行:jmap -dump:live,format=b,file=myjmapfile.hprof 31324

这里我们采用MAT工具去分析dump日志。

内存泄漏排查分析

 打开工具并且导入我们的dump日志。

内存泄漏排查分析

 通过圆饼图我们可以看到有个线程的内存占用率很高,然后里面显示的是一个数组对象很大。

 接着我们通过柱状图更直观的去看下。

内存泄漏排查分析

可以看到是这个实体类占的很高。

 接着,我们看下线程堆栈信息。

内存泄漏排查分析

 很明显,第一个占用最高的和我们前面饼状图提示的线程一致。所以我们点看这个线程详情看看。

内存泄漏排查分析

这里面有很多调用链路,但是其实我们只需要找到我们自己项目的链路信息就行。 

内存泄漏排查分析

果然,我们在这里找到了和我们前面对象一致的链路信息。接着我们只需要找到我们项目上这个文件的这个方法找到对应的位置就可以大致定位到泄露发生的地方了。