一. 背景
线上任务内存占用居高不下, 机器load较高. 排查问题原因.
二. 操作
2.1. 工具文件下载清单.
- mat 工具 linux版本. ( dump文件太大了有20多G, 只能在服务器上解析. 所以下载linux版本. )
下载地址: https://eclipse.dev/mat/downloads.php
- 下载高版本的jdk , 目前mat对jdk版本有要求, 服务器上是jdk8 , 暂时用不了, 就down一个新版本的jdk .
下载地址: https://www.oracle.com/cn/java/technologies/downloads/
2.1. 配置环境
- 将下载好的文件上传到服务器中. 存放到指定/opt目录
MemoryAnalyzer-1.14.0.20230315-linux.gtk.x86_64.zip
jdk-17_linux-x64_bin.tar.gz - 解压jdk
cd /opt
tar -xzvf jdk-17_linux-x64_bin.tar.gz
- 解压MemoryAnalyzer-1.14.0.20230315-linux.gtk.x86_64.zip
unzip MemoryAnalyzer-1.14.0.20230315-linux.gtk.x86_64.zip
- 进入MemoryAnalyzer-1.14.0.20230315-linux.gtk.x86_64.zip 备份MemoryAnalyzer.ini配置文件, 并修改
修改jvm路径和配置内存(如果不配置, 分析文件过大会oom).
sysadmin@master01:/opt/mat$ more MemoryAnalyzer.ini
-startup
plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar
-vm
/opt/jdk-17.0.8/bin/java
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.2.700.v20221108-1024
-vmargs
--add-exports=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
-Xmx20480m
2.2. 获取dump文件
根据进程id获取dump文件. 并写入指定/opt路径
注意这个时候服务会不可用. 如果内存过大, 生成的文件也会很大, 服务不可用的时间也会增多, 请评估风险.
jmap -dump:format=b,file=/opt/dump.hprof ${进程id }
2.3. 生成解析结果文件
nohup java /opt/mat/ParseHeapDump.sh /opt/dump.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components > /opt/mat.log 2>&1 &
2.4. 从服务器拉取解析结果文件
三. 分析问题
将获取的文件下载, 分别打开对应结果的index.html
Leak_Suspects 直译过来是:泄漏嫌疑人,就是说有可能出现内存泄漏的对象Mat都给我们统计在这里了。这个文件是我们排查内存泄漏的原因的主要文件。
Sytem_Overview 是系统总览。这个文件是JVM内存分析报告的大纲,可以通过这个大纲,看到所有对象、线程、内存占用的情况。
Top_Components 顶部组件。这个文件记录了一些内存使用浪费的,或者可以优化的类信息。
主要是dump_Leak_Suspects文件夹里面的index.html, 打开后里面有分析的主要结果, 可以明显知道某一个类里面用到hashmap占用太大的磁盘空间了.