[转帖]使用MAT命令行工具生成堆dump分析文件

使用,mat,命令行,工具,生成,dump,分析,文件 · 浏览次数 : 0

小编点评

**Java程序运行过程中出现 OOM,需要分析堆 dump 文件以确定导致 OOM 的原因。** **解决方法:** 1. **生成堆 dump 文件:** - 使用 `jmap` 命令生成堆 dump 文件。 - 将生成的堆 dump 文件压缩为 .tar.gz 文件。 2. **使用命令行脚本解析堆 dump 文件:** - 创建一个名为 `ParseHeapDump.sh` 的脚本。 - 在脚本中添加以下命令: - `java -Xmx16g -DhprofStrictnessWarning=true -jar \\ \"$(dirname -- \"$0\")\"/plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar \\ -consolelog -application org.eclipse.mat.api.parse \"$@\"-jar` - 将脚本执行:`./ParseHeapDump.sh` 3. **从 .tar.gz 文件中提取 index.html:** - 在脚本中添加以下命令: - `unzip -q Memory*.zip -d /home/hellxz/performance tar zxf heap_dump_20210128-1505.tar.gz3` - 进入 `performance` 目录,打开 `index.html` 文件。 **注意:** - 使用的 Java 版本必须与 MAT 版本相匹配。 - 将 `MemoryAnalyzer.ini` 中设置的 JVM 最大堆大小与实际内存大小相匹配。 - 如果出现 OOM 错误,请检查堆 dump 文件是否完整且是否有误行。

正文

https://www.cnblogs.com/hellxz/p/use_mat_linux_command_line_generate_reports.html

 

写作目标

Java程序运行过程中,难免会出现 OOM,往往是在 JVM 启动参数中添加出现 OOM 时输出堆 dump(又名:堆转储、堆快照)的参数,就在昨天下午我司生产环境出现 OOM,生成的堆 dump 有 16 个G,压缩后传回本地,想分析时犯了难——本地开发机 16G 内存,用 MAT 打不开!

通过查询相关文档,发现可以使用 MAT 命令行脚本生成可供 MAT 图形化界面展示的文件,也就是 用 Linux 服务器进行分析大堆/超大堆 dump 文件,输出分析报告,通过浏览器直接查看!

运行环境

  • CentOS 7.4
  • MemoryAnalyzer-1.10.0.20200225-linux.gtk.x86_64.zip
  • 16G堆dump
  • 开发机Win10,16G内存

MAT 下载地址 http://www.eclipse.org/mat/downloads.php

操作步骤

1 上传并解压 MAT 到服务器

上传 MAT 压缩包到服务器上

解压缩到Home目录

  unzip -q Memory*.zip -d /home/hellxz

2 上传堆 dump 文件到服务器

生产环境打堆 dump 及压缩,仅作演示,我这边是自动打出来的。

  # 生成堆 dump
  jmap -dump:format=b,file=heap_dump_20210128-1505.hprof 10532
  # 压缩堆 dump
  tar zcf /data/heap_dump_20210128-1505.tar.gz \
  heap_dump_20210128-1505.hprof

tar.gz压缩16G的堆dump仅占 4.77G,这里上传到了 MAT 分析服务器 /home/hellxz/performance 目录下

  cd performance
  tar zxf heap_dump_20210128-1505.tar.gz

3 调整 MAT 配置文件

  cd /home/hellxz/mat
  ls
  vim MemoryAnalyzer.ini

  -startup
  plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar
  --launcher.library
  plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.700.v20180518-1200
  -vmargs
  -Xms30g
  -Xmx58g
  -XX:+UseG1GC
  -DhprofStrictnessWarning=true
  • -vmargs 下边是指定JVM参数的地方,默认的 -Xmx1024m 太小了,另外,我这个堆实在太大,试了好多遍,发现58g左右才不会溢出……如果在后续操作中出现报错为 heap space 而停止分析,说明堆内存小了,改它!
  • -DhprofStrictnessWarning=true 参数最好加上,防止因为某些不必要的提示停止分析

4 执行 MAT 分析堆dump

  cd /home/hellxz/mat
  #执行 MAT 命令行脚本
  ./ParseHeapDump.sh \
  /home/hellxz/performance/heap_dump_20210128-1505.hprof \
  org.eclipse.mat.api:suspects \
  org.eclipse.mat.api:overview \
  org.eclipse.mat.api:top_components
  • MAT 会将文件分析文件与临时文件输出到堆 dump 目录下,临时文件中包含 .index 结尾的索引文件,首次分析会建立索引速度较慢,后续再执行其他任务就很快了
  • suspects / overview / top_componets 这几个 API 与 MAT 界面上显示的区域是一致的,对应这个命令中是 3 个任务,即生成名为 xxx_Leak_Suspects.zip / xxx_System_Overview.zip / xxx_Top_Components.zip 的分析报告,可选择分析三者任几个任务
  • 如执行出现错误,请去文末查找错误解决方法

MAT 分析时间较长,等待一段时间后,能得到三个 zip 压缩包
xxx_Leak_Suspects.zip / xxx_System_Overview.zip / xxx_Top_Components.zipxxx 会被替换为堆 dump 的名称

5 使用浏览器查看报告

将 xxx_Leak_Suspects.zip / xxx_System_Overview.zip / xxx_Top_Components.zip 三个压缩包下载到本地,分别解压,双击 index.html 使用浏览器查看即可。
如图,打开了 Leak_Suspects 解压的 index.html

真不是我屏幕黄,是校色工具搞的……

Q&A

1 提示X11转发打开窗口

取消打开窗口则报错: java.lang.InternalError: Can't connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variable.

解决办法:

  echo "export DISPLAY=:1" /etc/profile
  source /etc/profile

对于安装了桌面的临时处理办法,用完后修改回来,如果没装桌面就不用改回来了

2 提示 heap space,停止分析

设置mat目录下的 MemoryAnalyzer.ini,在 -vmargs 下调整JVM最大堆大小

3 提示 Unable to initialize GTK+

ParseHeapDump.sh 执行时调用了GTK的组件,当前OS环境不满足就会报错,解决方式是绕过GTK组件:

1)获取启动包路径

  cd mat
  ls plugins/org.eclipse.equinox.launcher*.jar

复制红字部分,一会改脚本需要用

2)修改 ParseHeapDump.sh

  cd mat
  vim ParseHeapDump.sh

注释第11行,添加新的启动命令

  java -Xmx16g -DhprofStrictnessWarning=true -jar \
  "$(dirname -- "$0")"/plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar \
  -consolelog -application org.eclipse.mat.api.parse "$@"

  • -jar 前为自定义JVM参数
  • plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar 请替换为第一步中获取的jar包名

未经许可禁止转载,如需转载请注明出处!https://www.cnblogs.com/hellxz/p/use_mat_linux_command_line_generate_reports.html
本文同步于本人CSDN

与[转帖]使用MAT命令行工具生成堆dump分析文件相似的内容:

[转帖]使用MAT命令行工具生成堆dump分析文件

https://www.cnblogs.com/hellxz/p/use_mat_linux_command_line_generate_reports.html 写作目标 Java程序运行过程中,难免会出现 OOM,往往是在 JVM 启动参数中添加出现 OOM 时输出堆 dump(又名:堆转储、堆

[转帖]org.hibernate.engine.query.spi.QueryPlanCache引起内存泄漏问题排查

事情缘由 协助公司中药网排查内存溢出的问题。这个系统是基于Hibernate3开发的一个药品信息、价格变动、药品咨询新闻相关的网站,90%的操作都是查询。 问题日志 工具排查 Dump堆内存文件,使用MAT进行分析 1、jsp 命令获取应用的pid 2、jmap -dump:format=b,fil

[转帖]Hibernate的QueryPlanCache引发的堆内存溢出

事情缘由 协助公司中药网排查内存溢出的问题。这个系统是基于Hibernate3开发的一个药品信息、价格变动、药品咨询新闻相关的网站,90%的操作都是查询。 问题日志 工具排查 Dump堆内存文件,使用MAT进行分析 1、jsp 命令获取应用的pid 2、jmap -dump:format=b,fil

[转帖]JVM 使用mat分析Dump文件排查大对象解决系统full GC问题

https://www.cnblogs.com/east7/p/16989436.html 摘要:介绍内存分析工具Mat查找大对象的使用方法,定位full GC根源,拉升系统吞吐量,避免内存泄漏。 引言 线上服务器频繁发生full GC,直接拉低系统吞吐量,甚至OOM。今天我们来一起学习一下如何利用

[转帖]JVM 使用mat分析Dump文件排查大对象解决系统full GC问题

https://www.cnblogs.com/east7/p/16989436.html 摘要:介绍内存分析工具Mat查找大对象的使用方法,定位full GC根源,拉升系统吞吐量,避免内存泄漏。 引言 线上服务器频繁发生full GC,直接拉低系统吞吐量,甚至OOM。今天我们来一起学习一下如何利用

[转帖]JVM 使用mat分析Dump文件排查大对象解决系统full GC问题

https://www.cnblogs.com/east7/p/16989436.html 摘要:介绍内存分析工具Mat查找大对象的使用方法,定位full GC根源,拉升系统吞吐量,避免内存泄漏。 引言 线上服务器频繁发生full GC,直接拉低系统吞吐量,甚至OOM。今天我们来一起学习一下如何利用

[转帖]org.hibernate.engine.query.spi.QueryPlanCache引起内存泄漏问题排查

问题现象: 一个后台服务在运行一段时间后,观察内存一直在增加,使用MAT工具,打开堆文件分析内存泄漏情况:fileName_Leak_Suspects的index 发现如下提示: One instance of "org.hibernate.internal.SessionFactoryImpl" 

[转帖]Eclipse MAT 内存分析工具

Exlipse MAT 是一款强大的 Java 堆内存分析工具,我们可以通过该工具实现对 Java 堆内存的分析。 官网。实现查找内存泄漏以及查看内存消耗的情况。 MAT 使用 首先去官网下载对应的软件压缩包,下载地址。MAT 提供了多种平台的软件包支持,包括 Windows , Mac OSX ,

[转帖]Eclipse-MAT的插件介绍使用

学习 尚硅谷 宋红康 JVM从入门到精通 的学习笔记 概述 MAT (Memory Analyzer Tool ) 工具是一款功能强大的Java堆内存分析器.可以用于查找内存泄露以及查看内存消耗情况. MAT是基于Eclipse开发的,不仅仅可以单独使用,还可以作为插件的形式内嵌在Eclipse中使

[转帖]jvm学习三-MAT内存分析工具的使用

目录 1 模拟内存溢出程序 1.1 jvm配置 1.2 测试代码 2 MAT工具进行内存分析 2.1 大纲介绍 2.2 Histogram视图介绍 2.3 Leak Suspects视图介绍 2.4 Dominator Tree 1 模拟内存溢出程序 1.1 jvm配置 -XX:+PrintGCDe