内存分析工具Memory Analysis Tool用法详解
  GQ7psP7UJw7k 2023年11月02日 60 0

1. 背景

内存分析指MAT,即memory analysis tool,通常使用eclipse提供的MemoryAnalyzer的工具包解析dump文件。可通过MAT解析内存泄漏、查看内存中变量大小。

2. 生成dump文件

dump一般译作转储,有动词和名词两种场景。动词场景:因为程序在计算机中运行时,在内存、CPU、I/O等设备上的数据都是动态的(或者说是易失的),也就是说数据使用完或者发生异常就会丢掉。如果我想得到某些时刻的数据(有可能是调试程序Bug或者收集某些信息),就要把他转储(dump)为静态(如文件)的形式。否则,这些数据你永远都拿不到。 名词场景:dump作为名词一般就是指dump(动词)的结果文件。

jmap

jmap主要可以用于打印Java进程的内存映射或堆内存(Heap Dump文件)细节。(如:产生哪些对象,以及数量等)。主要是用在检查内存泄漏、一些严重影响性能的大对象,检查系统中什么对象创建的最多,分析各种对象所占用的大小等。

命令:

jmap -dump:format=b,file=dataNode17600.hprof 17600

解释:

  • format=b 表示生成的dump文件是二进制格式的。
  • file=dataode17600.hprof 表示在当前目录下生成dataode17600.hprof这个dump文件。

更多jmap参数直接使用man jmap命令查看。

3. 安装dump文件解析工具MAT

MAT用于解析dump文件,可以查看内存泄漏,或者对象中的成员变量,非常好用。

3.1 方式一: MacOS (M1芯片)安装MAT工具(推荐)

下载JDK18: https://www.oracle.com/java/technologies/downloads/

image.png

注意:aarch64就是指的arm架构的M1芯片。

下载MAT软件:

http://www.eclipse.org/mat/downloads.php

image.png

配置MAT参数:

默认情况下,在/Applications/mat.app/Contents/Eclipse/MemoryAnalyzer.ini文件中,MAT最大内容为1GB,需要改成4GB:

-startup
../Eclipse/plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar
--launcher.library
../Eclipse/plugins/org.eclipse.equinox.launcher.cocoa.macosx_1.2.400.v20211117-0650
-vmargs
-Xmx4096m
-Dorg.eclipse.swt.internal.carbon.smallFonts
-XstartOnFirstThread

3.2 方式二:linux安装MAT工具

http://www.eclipse.org/mat/downloads.php

image.png

并下载linux版本的JDK11,在mat/MemoryAnalyzer.ini配置文件中增加JDK的配置:

~
MemoryAnalyzer.ini
"MemoryAnalyzer.ini" 8L, 228C
-vm
/home/hadoop/software/jdk11/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
-Xmx1024m

4. MacOS解析dump文件

打开dump文件: image.png

可以直接查看对象的成员变量的值: image.png

5. Linux解析dump文件

使用ParseHeapDump.sh脚本解析dataode17600.hprof文件:

mat/ParseHeapDump.sh ../dump/dataNode17600.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components

其中:

  • org.eclipse.mat.api:suspects 表示生成内存泄露报告
  • org.eclipse.mat.api:overview 表示生成概述报告
  • org.eclipse.mat.api:top_components 表示生成大对象报告

注意:分析结果默认放到.hprof文件同级目录,应该创建一个新的文件夹,将.hprof放到这个文件夹,分析结果文件会自动放到这个新文件夹中,避免在父文件夹生成过多的内存分析文件,很难看。

运行如下:

image.png

生成如下文件,其中.zip文件有用,里面包含html文件,html文件中包含内存分析结果:

image.png

将三个zip包下载到本地,解压后,其中一个zip包如下:

image.png

打开index.html,就可以看内存泄漏分析结果:

image.png

概览:

image.png

大对象报告:

image.png

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

GQ7psP7UJw7k