码迷,mamicode.com
首页 > 其他好文 > 详细

生产JVM问题排查解决

时间:2019-12-25 10:23:59      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:mamicode   工具   ror   apache   介绍   语句   排查   底部   add   

收集内存溢出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问题排查解决

标签:mamicode   工具   ror   apache   介绍   语句   排查   底部   add   

原文地址:https://www.cnblogs.com/coderdxj/p/12095171.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!