利用MAT排查堆溢出
如果在代码中使用了一个无限循环来为list添加对象,如果采用默认的堆大小的话,可能要等待好久才能出现堆溢出的错误,因此我们要将其设置小一点: -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError(-Xms10m,意思就是堆的最小内存为10m。同理 -Xmx10m的意思就是最大内存也为10m)。-XX:+HeapDumpOnOutOfMemoryError指的是当发生内存溢出的时候会将当前的内存使用情况生成一个快照保存起来,但需要eclipse下载一个MAT的插件。然后执行程序,不久就会出现异常,详见如图:
刷新eclipse项目,可以找到对应的文件java_pid8404.hprof
首先可以看到的是一个饼状图,占用部分最大的便是发生溢出错误的部分。
我们这里看看画红线的部分,这里列出一些存活的大对象,在溢出的时候一般先怀疑大对象,我们点进去:
接上图,点击进入,如下图:
发现都是object对象,因此排查的时候可以从这个方面下手。接着我们右键该对象选择Path To GC Root(在引用链上的路径),再选择exclue all phantom/weak/soft etc. reference ,结果如图:
可以看到他是被List引用了,因此一直在引用链上,导致无法被回收掉,也就出现了内存溢出。