生产JVM问题排查解决

Posted coderdxj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生产JVM问题排查解决相关的知识,希望对你有一定的参考价值。

收集内存溢出Dump文件

收集Dump文件有两种方式:

  • 设置JVM启动参数
    -XX:+HeapDumpOnOutOfMemoryError
    -XX:HeapDumpPath=/opt/jvmdump

在每次发生内存溢出时,JVM会自动将堆转储,dump文件存放在-XX:HeapDumpPath指定的路径下。

  • 使用jmap命令收集
    通过jmap -dump:live,format=b,file=/opt/jvm/dump.hprof pid。

分析Dump文件

在获取Dump文件后,可以使用工具MAT(MemoryAnalyzer)进行分析,该工具大家可以通过百度自行下载。

使用MAT打开Dump文件后,首页截图如下:

 技术图片

 

 工具按钮介绍:

技术图片

技术图片

 

 

:内存使用树状结构,以线程为维度,树状形式展开,如图所示:

技术图片

 

 

从上面的截图中可以得出如下关键信息点:

  • org.apache.ibatis.executor.result.DefaultResultHandler内部持有一个List,其原始为java.util.HashMap,从这个类基本可以看出是与数据库的查询相关,对数据库返回结果的解码并组织成HashMap。

  • 这个List中的元素总共有146033个,初步可以判断出是在一次查询中从数据库中一次查询出了太多数据,造成了内存溢出。

由于SQL查询代码中,是用HashMap来接收数据库中的返回字段,无法一时间看出是那个查询,那我们能不能精确找到是哪一个查询,哪一行代码,甚至与哪一条SQL

接下来我们从 视图去寻找是哪个方法,哪条SQL语句触发的。

具体方法:首先完全展开一个线程,从展开图的底部向上寻找:
其线程的入口(控制层代码)

以上是关于生产JVM问题排查解决的主要内容,如果未能解决你的问题,请参考以下文章

生产环境-jvm内存溢出-jprofile问题排查

一次 G1 堆大小不均问题的排查及解决

利用JVM在线调试工具排查线上问题

利用JVM在线调试工具排查线上问题

利用JVM在线调试工具排查线上问题(超实用)

生产环境OOM死锁问题排查修复