zoukankan      html  css  js  c++  java
  • 生产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语句触发的。

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

  • 相关阅读:
    SpringBoot 创建 console程序
    SpringBoot 参数检查 Controller中检查参数是否合法
    SpringBoot 使用maven创建springboot项目
    idea 社区版本创建javaweb项目 使用jetty
    idea 社区版本创建javaweb项目 使用tomcat
    mysql 主从 设置
    windows 使用nginx
    Linux 安装Nginx
    闭包小应用
    js小程序写法优化
  • 原文地址:https://www.cnblogs.com/coderdxj/p/12095171.html
Copyright © 2011-2022 走看看