jprofiler排查内存溢出问题

在生产上如果遇到内存溢出问题应该怎样排查?
一:在启动应用或者容器之前配置问下参数
1.1、如果是直接Linux部署tomcat这实现添加如下参数

JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS -server -Xms6144m -Xmx6144m -XX:NewSize=384m -XX:MaxNewSize=450m -XX:PermSize=128m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/logs"

说明:
-XX:+HeapDumpOnOutOfMemoryError 会在发生内存溢出时dump内存快照
-XX:HeapDumpPath=/home/logs 保存内存快照的目录
1.2、如果是springboot应用
添加参数

JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS -server -Xms6144m -Xmx6144m -XX:NewSize=384m -XX:MaxNewSize=450m -XX:PermSize=128m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/logs"

说明:同上关注的两个参数

二:当发生内存溢出就会生成.hprof快照文件如图
在这里插入图片描述
三:如果本地安装了jprofiler软件这可以直接点击打开不过这个过程很长,因为会进行解析。效果如下
jprofiler排查内存溢出问题_第1张图片
四:默认排序按照生成实例的数量,由于是内存溢出我们可以让其按照占用内存大小进行排序
jprofiler排查内存溢出问题_第2张图片
排序后如图
jprofiler排查内存溢出问题_第3张图片
五、很明显生成对象达到了631MB这里就有点儿头绪了,肯定是后端代码造成了内存溢出,接着往下查找。
点击右键 -> Use Selected Instances -> 选中(incoming references)-> 确定

六、如图
jprofiler排查内存溢出问题_第4张图片
红框的参数的对象最多,我们就分析他。如图
jprofiler排查内存溢出问题_第5张图片
七:进入Graph页面
jprofiler排查内存溢出问题_第6张图片
说明:很明显对象多的原因是由于大量的 sssss这个字符串引起的,
八:右键点击如图所示
jprofiler排查内存溢出问题_第7张图片

说明:这里就可以查到报错信息
九:报错信息截图
jprofiler排查内存溢出问题_第8张图片
说明:在testMemory()这个方法的 34行去查找,代码截图
jprofiler排查内存溢出问题_第9张图片

你可能感兴趣的:(java,linux,java,运维)