记一次JAVA内存溢出排查方式
写代码时,偶尔会碰到java.lang.OutOfMemoryError:Java head space,或metaspace。一般这个会进行百度,然后根据别人的经验修改Xmx参数,扩大堆最大内存。但是有时候内存溢出是我们代码问题。由于服务器可能在报错的时候就已经关闭了,所以我们没办法根据服务器查找到代码原因,所里这里采用查看内存快照的方式进行查看。
一、模拟内存溢出bug
在idea代码中加入死循环
二、项目打包,并设置发布参数
为模拟实际情况,这里采用java -jar发布并设置发布参数
maven install打包
编写bat启动项
#开启内存快照,指定快照存放目录
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/app/dumps/
三、启动项目,实现内存溢出
启动项目
浏览器访问死循环,并返回报错
四、查看内存快照并分析
- 从jdk中打开jvisualvm.exe
- 打开后在点击左上角【文件】-【装入】打开刚刚指定目录下的内存快照文件
打开后如图所示
打开后红框处已经显示出内存异常的原因和线程,点击线程名
红框处可查看到本次内存溢出的导火索是具体哪一行代码导致