廉颇老矣,装个EclipseMemoryAnalyzer都能卡一小时
背景
大家好,我是逐日。最近运维反馈有个项目的内存有点高,怀疑是不是内存泄漏,我就让他给我dump了一下内存,准备用EclipseMemoryAnalyzer(MAT)分析下。
dump命令: jmap -dump:live,format=b,file=heap.bin 进程pid
mat下载
https://eclipse.dev/mat/download/
我是下载的windows版本。
然后解压即可,注意路径不要有中文和空格。

报错
jdk21安装

由于手里没有多模态模型,只能让豆包协助我了,我其实感觉豆包在多模态这块还不错,平时生活中有个啥搞不懂,拍个图就丢过去了。
豆包先怀疑是不是图里那个jar包不存在,那当然不至于,我甚至发现dbeaver也用了这个jar包:

然后一开始查了下,说新版本的mat要jdk17至少,但我想着再确认下。
用jd-gui.exe反编译了一下,发现有这个Main类:

class字节码的版本是jdk 17,那就至少得jdk17才能打开这个jar包了:

我本地这个新电脑还没jdk17,只有jdk8,那先安装一下。
直接装个jdk21吧:
https://www.oracle.com/java/technologies/javase/jdk21-archive-downloads.html
Windows x64 Installer

修改MAT配置文件,使用jdk21
在网上搜了下怎么改配置,以指定jdk21来打开mat。
然后直接就改了下MemoryAnalyzer.ini,网上答案五花八门,我试了好多种错误方案,如:

还有以下错误答案:
为啥想着加引号,因为路径中间有空格,所以想着加一下:
-vm
"C:/Program Files/Java/jdk-21.0.12/bin/javaw.exe"
-vm
"C:/Program Files/Java/jdk-21.0.12/bin/"
还有windows反斜杠也试了。
结果后来,在cmd中试成功了:
这个可以:
F:\tools\MAT\MemoryAnalyzer-1.17.0.20260601-win32.win32.x86_64>MemoryAnalyzer.exe -vm "C:/Program Files/Java/jdk-21.0.12/bin/"
但我把同样配置弄到配置文件里,还是不行;然后豆包给我说,ini文件里不能用引号,那就这样:

结果还是报错。
豆包又一顿分析,说要不你就是文件的格式是utf8(带了bom),导致这一行格式有问题:

vscode安装Hex Editor插件直接查看二进制
正常来说,在notepad++之类或者vscode里,看到是utf8,可能基本能确定是UTF8还是带bom的utf8.
为了看得清清楚楚,我们可以直接看二进制。
vscode中有个hex editor插件:

文件上右键,

通过前几个字节就能看出来有没有bom:
- 如果输出开头是
EF BB BF→ 存在 UTF‑8 BOM

按理说,我上面那个没bom,结果还是有问题。
豆包又给我分析了下,这次可是真分析到点上了,原来是短横线有点问题:

然后手动重新敲了下短横线。还真的可以了。卧槽...
内存调整
mat需要自己调整下内存,不然dump文件很大就打不开:

总结
刚写文的时候,找到了mat对应的github,发现readme里面就写了要怎么设置vm,结果当时没看到这个页面。折腾半天。
https://github.com/eclipse-mat/mat/wiki/faq
贴一下我这的配置:
-vm
C:/Program Files/Java/jdk-21.0.12/bin/
-startup
plugins/org.eclipse.equinox.launcher_1.7.100.v20251111-0406.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.3.0.v20260203-2149
-vmargs
--add-exports=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
-Xmx2048m


浙公网安备 33010602011771号