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

我们可以看到老年代的空间基本都占满了。
由于可以看到老年代空间基本都满了,所以可以想到现在程序肯定在疯狂的进行GC操作,我们执行下命令看看:jstat -gc pid 1000
可以看出fullGC非常频繁,但是老年代的空间却并没减少,应该是发生了内存泄漏。
我们导出下dump日志看看,执行:jmap -dump:live,format=b,file=myjmapfile.hprof 31324
这里我们采用MAT工具去分析dump日志。
打开工具并且导入我们的dump日志。
通过圆饼图我们可以看到有个线程的内存占用率很高,然后里面显示的是一个数组对象很大。
接着我们通过柱状图更直观的去看下。
可以看到是这个实体类占的很高。
接着,我们看下线程堆栈信息。
很明显,第一个占用最高的和我们前面饼状图提示的线程一致。所以我们点看这个线程详情看看。
这里面有很多调用链路,但是其实我们只需要找到我们自己项目的链路信息就行。
果然,我们在这里找到了和我们前面对象一致的链路信息。接着我们只需要找到我们项目上这个文件的这个方法找到对应的位置就可以大致定位到泄露发生的地方了。