首页 > 其他分享 >[转帖]使用MAT命令行工具生成堆dump分析文件

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

时间:2024-01-23 09:04:37浏览次数:32  
标签:MAT zip xxx 转帖 org dump mat

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

 

本文作者:东北小狐狸

本文链接:https://www.cnblogs.com/hellxz/p/use_mat_linux_command_line_generate_reports.html

版权声明:本作品采用自由转载-非商用-非衍生-保持署名 (CC BY-NC-ND 3.0)许可协议进行许可。

标签:MAT,zip,xxx,转帖,org,dump,mat
From: https://www.cnblogs.com/jinanxiaolaohu/p/17980362

相关文章

  • [转帖]OS、PFS、DFS 有啥区别?一文搞懂 6 大临床试验终点
    https://oncol.dxy.cn/article/670607 说到肿瘤临床研究,就不得不说临床试验终点(EndPoint),比如大家熟知的OS、PFS、ORR还有DFS、TTP、TTF……不同的终点服务于不同的研究目的。让我们一起来看看常用的临床试验终点都有什么区别以及优缺点。总生存overallsurvival,OS......
  • CodeForces 1609G A Stroll Around the Matrix
    洛谷传送门CF传送门我独立做出一道*3000?考虑对于单次询问,除了\(O(nm)\)的dp,有没有什么方法能快速算出答案。发现若\(a_{i+1}-a_i<b_{j+1}-b_j\)则\(i\getsi+1\),否则\(j\getsj+1\)是最优的。这个贪心的证明不难,考虑当前新走到某一行或某一列的贡献......
  • [转帖]MySQL多版本并发控制机制(MVCC)-源码浅析
    https://zhuanlan.zhihu.com/p/144682180 MySQL多版本并发控制机制(MVCC)-源码浅析前言作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾。<<事务处理-概念与技术>>诚然讲的非常透彻,但只能提纲挈领,不能让你玩转某个真正的数据库。感谢c......
  • [转帖]CIDR
    什么是CIDR?无类别域间路由(CIDR)是一种IP地址分配方法,可提高互联网上的数据路由效率。每台连接到互联网的计算机、服务器和最终用户设备都有一个与之关联的唯一编号,称为IP地址。设备通过使用这些IP地址相互查找和通信。组织使用CIDR在其网络中灵活高效地分配IP......
  • 基于CMFB余弦调制滤波器组的频谱响应matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本matlab2022a 3.算法理论概述        CMFB余弦调制滤波器组是一种基于余弦调制技术的滤波器组,它具有频率选择性和可调性,可以广泛应用于信号处理、图像处理、通信等领域。下面将详细介绍其原理、数学公式等。 3.1......
  • 基于MIMO通信系统的球形译码算法matlab性能仿真,对比PSK检测,SDR检测
    1.算法运行效果图预览 2.算法运行软件版本MATLAB2022A 3.算法理论概述      球形译码算法(SD)是一种基于多输入多输出(MIMO)通信系统的检测算法。与相移键控(PSK)和软件定义无线电(SDR)相比,它具有更高的频谱效率和可靠性,下面将详细介绍SD算法。       ......
  • 【OpenCV】:浅析 OpenCV 中的图像数据结构 Mat
    以下内容主要来自OpenCV中的mat.hpp这个头文件关于MatMat是OpenCV中用来存储图像数据的基础数据结构,原话是Itcanbeusedtostorerealorcomplex-valuedvectorsandmatrices,grayscaleorcolorimages,voxelvolumes,vectorfields,pointclouds,tensors,......
  • sed的&操作符+复盘和把经验转化为能力+sed替换关联环境变量+SystemC+C++的struct和cla
    sed的&操作符sed一般是按行操作,如果匹配到,那么匹配到的内容被表示为&。以下是在单行操作中,想要实现在某行数据特定字符前后插入字符的方法。复盘和把经验转化为能力https://www.163.com/dy/article/GEI2Q9EN05429MRP.html通过寻找和尝试新的做事方式,你才能提高自己的能力。......
  • Python Matplotlib 常见图形绘制
    ​ 参考文档:PythonMatplotlib常见图形绘制-CJavaPy1、折线图(LinePlot)绘制折线图(LinePlot)是一项基础且常用的功能。折线图非常适合展示数据随时间或其他连续变量变化的趋势。使用plt.plot() 函数用于在坐标轴上绘制折线图(LinePlot),它提供了多种参数来自定义图像的外观。......
  • gdb查coredump问题流水账
     1,前言如果c++发生了coredump,该怎么办。写c++项目很是头疼的是碰到c++的coredump,程序终止的时候留的信息很有限,不知道怎么查找问题。  2,GDB介绍一直想了解GDB是怎么使用的却没怎么深入了解,只是简单熟悉了gdb的简单使用命令,比如辅助来打断点,熟悉代码调用栈的作用。(1),gdb启......