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软件这可以直接点击打开不过这个过程很长,因为会进行解析。效果如下
《jprofiler排查内存溢出问题》
四:默认排序按照生成实例的数量,由于是内存溢出我们可以让其按照占用内存大小进行排序
《jprofiler排查内存溢出问题》
排序后如图
《jprofiler排查内存溢出问题》
五、很明显生成对象达到了631MB这里就有点儿头绪了,肯定是后端代码造成了内存溢出,接着往下查找。
点击右键 -> Use Selected Instances -> 选中(incoming references)-> 确定

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

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

    原文作者:sunnyboy_4
    原文地址: https://blog.csdn.net/u012228523/article/details/122089718
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞