Linux无头模式使用mat分析dump的方法

linux,无头,模式,使用,mat,分析,dump,方法 · 浏览次数 : 398

小编点评

## 使用 Linux 进行 JVM 内存 dump 分析 **步骤 1:下载并解压缩 mat** * 从 Eclipse 网站下载 jdk 17 版本的压缩包或 tar 包。 * 将压缩包解压缩到与 mat 目录相同的目录下。 * 确保 jdk 解压缩后的 bin目录位于 mat 目录的 bin 子目录下。 **步骤 2:修改 MemoryAnalyzer.ini 文件** * 将 `-vm` 参数添加到 `MemoryAnalyzer.ini` 的 `-vm` 中。 * 将 `-vmjdk-19.0.1` 参数添加到 `MemoryAnalyzer.ini` 的 `-vmjdk` 中。 * 调整其他参数,如 `-Xmx`、`-Xms`、`-DhprofStrictnessWarning` 等。 **步骤 3:运行 MemoryAnalyzer.sh** * 将 `MemoryAnalyzer.ini` 文件添加到 `dumpanalyze` 的 `config` 文件中。 * 运行 `dumpanalyze` 命令。 **步骤 4:分析 dump 文件** * 启动 `MemoryAnalyzer` 应用程序。 * 选择 `Load Dump` 文件进行分析。 * 可以在分析窗口中查看内存使用情况、线程数量等信息。 **注意事项:** * 该方法仅适用于 JVM 运行的服务器。 * 由于分析可能占用大量时间,请确保机器充足资源。 * 不要在正在生产的服务器上进行分析。 **其他资源:** * 使用 `MemoryAnalyzer` 分析 JVM 内存 dump 文件的教程: * https://www.cnblogs.com/hellxz/p/use_mat_linux_command_line_generate_reports.html * 下载 jdk 17 版本压缩包: * https://www.eclipse.org/downloads.php

正文

摘要

mat可以很好的进行jvm的内存dump的分析.
但是大部分服务器是没有GUI界面的. 
而且就算是有GUI界面也很难直接使用. 
但是随着jvm堆区越来越大. WindowsPC机器已经很难进行分析.
所以基于此. 想着能够使用Linux进行简要分析
然后使用Windows进行打开. 
根据网上查到的资料进行了简单的测试验证. 准备进行一次处理. 

学习来源

https://www.cnblogs.com/hellxz/p/use_mat_linux_command_line_generate_reports.html
感谢原作者
为了方便使用, 我这边进行了一下简单处理, 提高了一定的效率. 

下载mat的介质

注意下载地址为:
https://www.eclipse.org/mat/downloads.php
需要注意,进入下载界面可以选择大陆的大学mirro镜像站点速度会快很多.

需要注意, 最新的1.13 的版本需要使用 jdk17以上的版本
建议可以下载最新的JDK进行处理. 我这边使用的OpenJDK19.0.1
自行下载tar包或者是zip包即可.

解压缩mat.并且手工添加jdk

解压缩好mat的文件后
建议将jdk解压缩到mat的目录下面. 
这种方式最简单, 不需要使用linux或者是windows的环境变量内的java程序
能够方便快捷的进行部署. 
比如linux的目录为:
需要注意:
1. dumpanalyze 是我手工编写的命令行脚本
2. jdk-19.0.1 是Openjdk的目录.

.
├── configuration
├── dumpanalyze
├── epl-2.0.html
├── features
├── jdk-19.0.1
├── MemoryAnalyzer
├── MemoryAnalyzer.ini
├── notice.html
├── p2
├── ParseHeapDump.sh
├── plugins
└── workspace

修改配置文件, 注意这一步需要根据linux机器的配置

比如我这边的文件修改为:
需要注意:
1. -vm 指定java的二进制地址,便于区分版本,jdk添加进来可以节约很多工作量.
2. -Xmx -Xms 注意不能大于操作系统剩余内存的 80%
3. -DhprofStrictnessWarning=true 出现错误时可以忽略.
4. 注意务必不能在正在生产的服务器上面进行此动作.
vim MemoryAnalyzer.ini

-vm
./jdk-19.0.1/bin/java
-startup
plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.2.400.v20211117-0650
-vmargs
-Xmx30G
-Xms30G
-DhprofStrictnessWarning=true


编写分析脚本

需要注意:
1. 我这边仅是简单read -p 读入文件路径, 最简单的进行处理.
2. 注意解析完成之后 会在dump同级目录生成很多index文件,以及三个zip文件
3. zip文件可以解压缩后通过浏览器打开. index文件可以使用windows的同版本mat进行打开
4. 理论上分析过了一遍的dump, 统计目录有index目录,再次就不需要分析,仅需要打开就可以了.
5. 因为比较晚上, 改天白天我验证一下, 然后提醒我删掉 第五条. 

vim dumpanalyze

echo "请输入完整的 dump路径名进行分析: "
read -p "文件全路径+文件名: " dumpname
./ParseHeapDump.sh \
$dumpname \
org.eclipse.mat.api:suspects \
org.eclipse.mat.api:overview \
org.eclipse.mat.api:top_components


Windows版本的处理

Windows版本很类似 只需要修改配置文件就可以. 
编辑 MemoryAnalyzer.ini
注意 -vm 使用当前路径下的jdk就可以 简单便捷.

-vm
jdk-19.0.1/bin/java
-startup
plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.2.400.v20211117-0650
-vmargs
-Xmx4G

其他优化

mat 有一个batch mode 模式
计划简单学习一下 用来完善这个文档. 
需要完善的点 
1. compare模式.
2. 大内存dump的验证

解析过的效果为:
[root@openeuler2203 ~]# ll
总用量 652M
-rw-r--r--  1 root root 5.5M 11月 22 00:25 zhaobsh.a2s.index
-rw-r--r--  1 root root  18M 11月 22 00:25 zhaobsh.domIn.index
-rw-r--r--  1 root root  43M 11月 22 00:25 zhaobsh.domOut.index
-rw-------  1 root root 344M 11月 22 00:24 zhaobsh.dump
-rw-r--r--  1 root root 142K 11月 22 00:25 zhaobsh.i2sv2.index
-rw-r--r--  1 root root  46M 11月 22 00:25 zhaobsh.idx.index
-rw-r--r--  1 root root  52M 11月 22 00:25 zhaobsh.inbound.index
-rw-r--r--  1 root root 4.4M 11月 22 00:25 zhaobsh.index
-rw-r--r--  1 root root 128K 11月 22 00:25 zhaobsh_Leak_Suspects.zip
-rw-r--r--  1 root root  18M 11月 22 00:25 zhaobsh.o2c.index
-rw-r--r--  1 root root  45M 11月 22 00:25 zhaobsh.o2hprof.index
-rw-r--r--  1 root root  30M 11月 22 00:25 zhaobsh.o2ret.index
-rw-r--r--  1 root root  52M 11月 22 00:25 zhaobsh.outbound.index
-rw-r--r--  1 root root  83K 11月 22 00:25 zhaobsh_System_Overview.zip
-rw-r--r--  1 root root  27K 11月 22 00:24 zhaobsh.threads
-rw-r--r--  1 root root 482K 11月 22 00:25 zhaobsh_Top_Components.zip

与Linux无头模式使用mat分析dump的方法相似的内容:

Linux无头模式使用mat分析dump的方法

摘要 mat可以很好的进行jvm的内存dump的分析. 但是大部分服务器是没有GUI界面的. 而且就算是有GUI界面也很难直接使用. 但是随着jvm堆区越来越大. WindowsPC机器已经很难进行分析. 所以基于此. 想着能够使用Linux进行简要分析 然后使用Windows进行打开. 根据网上查

Linux 堡垒机命令行中如何上传下载文件(SecureCRT - SFTP)

SFTP 常用命令 通过堡垒机进入的 Linux 操作系统,无法直接使用 WinSCP 等工具进行文件的上传下载。 可使用 SecureCRT 先进入命令行模式

[转帖]【KVM】KVM和QEMU的关系及区别

KVM架构 KVM(Kernel-based Virtual Machine)包含一个为处理器提供底层虚拟化、可加载的核心 模块kvm.ko(kvm-intel.ko或kvm-amd.ko),使用QEMU(QEMU-KVM)作为虚拟机上层 控制工具。KVM无需改变Linux或Windows系统就能运

[转帖]掌握Linux中的12个grep命令

http://blog.itpub.net/70023145/viewspace-2924123/ 你是否遇到过需要在文件中查找一个特定的字符串或者样式,但是不知道从哪儿开始?那么,就请grep来帮你吧。 grep是每个Linux发行版都预装的一个强有力的文件模式搜索工具。无论何种原因,如果你的系统

[转帖]从VMware ESXI主机在线扩容到虚拟机磁盘扩容

一、需求 虚拟机磁盘空间不足,需要扩容,ESXI主机未接存储,且虚拟机磁盘模式均为“厚置备延迟置零”,主机仅剩余16GB存储空间,无法满足扩容需求,需要为ESXI主机的磁盘组进行扩容。 操作过程:插入物理磁盘–>配置磁盘RAID–>ESXI存储扩容–>虚拟机添加硬盘–>linux lvm扩容。 整个

SElinux 导致 Keepalived 检测脚本无法执行

哈喽大家好,我是咸鱼 今天我们来看一个关于 `Keepalived` 检测脚本无法执行的问题 一位粉丝后台私信我,说他部署的 `keepalived` 集群 `vrrp_script` 模块中的脚本执行失败了,但是手动执行这个脚本却没有任何问题 ![image](https://img2023.cn

运维排查篇 | Linux 连接跟踪表满了怎么处理

nf_conntrack (在老版本的 Linux 内核中叫 ip_conntrack )是一个内核模块,用于跟踪一个网络连接的状态 一旦内核 netfilter 模块 conntrack 相关参数配置不合理,导致 nf_conntrack table full ,就会出现丢包、连接无法建立的问题

2023年windows DockerDeskTop最新款4.18.0 全程保姆级安装

前景提示 想在windows10上安装一个docker容器的desktop版本,但是,总是安装wsl不好使,同时,windows store没有了,用命令行安装的linux系统无法启动,也无法连接,之前想到的方案是安装旧的版本,然后,快速关闭wsl的验证功能,勉强可以跑起来,但是,存在大量问题和功能

[转帖]编译实战 | 手摸手教你在Windows环境下运行Redis6.x

原创:微信公众号 码农参上,欢迎分享,转载请保留出处。 哈喽大家好啊,我是没事就愿意瞎捣鼓的Hydra。 不知道有没有小伙伴像我一样,平常开发中用的是windows操作系统,有时候想装点什么软件,一看只支持linux系统,无奈要么启动虚拟机、要么装在云服务器上。 这不前几天又是这样,刚想用一下Red

bash shell 无法使用 perl 正则

哈喽大家好,我是咸鱼。今天跟大家分享一个关于正则表达式的案例,希望能够对你有所帮助 案例现象 前几天有一个小伙伴在群里求助,说他这个 shell 脚本有问题,让大家帮忙看看 可以看到,这个脚本首先将目标文本文件的名字当作该脚本的第一个参数($1)传递进去,然后查看这个文本文件的内容(cat $1),