说到排查,如果我们能够拿到异常时的内存快照,然后通过一些工具就可以进行内存的分析了。
那么我们怎么去拿到内存溢出时的快照呢?其实,JDK也为我们提供了这样的命令参数,我们来看一下吧,
-XX:+HeapDumpOnOutOfMemoryError,从字面就可以很容易的理解,在发生OutOfMemoryError异常时,进行堆的Dump,这样就可以获取异常时的内存快照了。
-XX:HeapDumpPath=D:\heap-dump\,这个也很好理解,就是配置HeapDump的路径,方便我们管理
这里我们配置为D:\heap-dump,当然你也可以根据自己的需要,定义为其他的目录
注意HeapDumpPath的目录一定要手动创建好,如果没有这个目录,Dump会失败的。
IDEA中的配置,如图:
我们再运行一下程序,看看是什么样子,
java.lang.OutOfMemoryError: Java heap space
Dumping heap to D:\heap-dump\java_pid24312.hprof …
Heap dump file created [123468648 bytes in 0.141 secs]
java.lang.OutOfMemoryError: Java heap space
at com.diancan.JavaO0MDemo.main(JavaOOMDemo.java: 14)
执行了14次
我们发现日志上面多了点东西,创建了一个文件,在D:\heap-dump\java_pid24312.hprof。这个文件就是我们的内存快照。那么问题来了,我们如何查看这个文件呢?直接打开是不行的,用写字板等也是不行的,那怎么办?其实也没那么复杂,使用JDK自带的jvisualvm就可以查看。
这里边有个小坑,如果大家用JDK8,可以在JDK的bin目录下找到jvisualvm.exe,但是如果你使用的是JDK8 以上的版本,就本示例中,使用的是JDK11,在bin目录下是找不到jvisualvm.exe的。大家可以去visualvm的主页下载。
我们启动visualvm,进入到如下的页面,
然后,点击左上角的加载快照按钮,然后选择我们Dump的文件,
我们重点看一下右侧中间的部分,
类的实例大小排序,可以看到,我们的Byte占了96.5%。详细的信息,我们可以点进去看,包括可以判断是真的内存不够了,还是我们的代码出了问题。
Was this helpful?
0 / 0