• 生产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语句触发的。

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

  • 相关阅读:
    WPF 插件开发(.NET Framework 3.5 System.Addin)
    如何:创建返回 UI 的外接程序
    WPF分析工具
    可视化的工具
    .NET Core入门程序
    我是如何同时拿到阿里和腾讯offer的 【转载】
    我的求职之路:9个offer,12家公司,35场面试,最终谷歌【转载】
    Mysql 配置文件和目录的合理分配
    修改socket文件, MySQL启动报错
    confluence + 禅道安装教程
  • 原文地址:https://www.cnblogs.com/coderdxj/p/12095171.html
Copyright © 2020-2023  润新知