一、介绍
MAT全称是Memory Analyzer(Tool),是eclipse开发用来分析JVM堆栈内存的工具。(相比之下JDK自带的VisualVM内存分析还是差点意思)。在使用之前你需要根据你导出来的dump文件的堆大小调整MAT的内存大小,(MAT默认大小是1G,当然如果你的堆内存特别大的话,MAT用起来可能会有点卡顿),直接在配置文件MemoryAnalyzer.ini中修改即可。
二、为什么需要MAT?
由于对象内存大小涉及到GC回收的时延,对象越大,回收时间越长,尤其是有引用的时候,在GC年龄段内会在年轻代返回的拷贝,非常耗时,因此清楚项目中哪些对象占用的内存很大是很有必要的。
三、分析步骤
1、通过jps命令查看java 进程为812251;
2、生成堆内存活着的对象使用情况:一般情况下生成的文件会很大,我们项目alarm生成的文件2.2G。
使用jmap命令。
jmap 命令是JDK提供的用于生成堆内存信息的工具,可以执行下面的命令生成Heap Dump:
1 |
|
jmap -dump:live,format=b,file=pid.hprof 812251
3、将生成的文件pid.hprof下载到本地(windows)进行分析
4、下载分析工具MemoryAnalyzer,下载地址:https://www.eclipse.org/mat/downloads.php
下载完成后,双击MemoryAnalyzer.exe,点击Open a Heap Dump
注意:MemoryAnalyzer的MemoryAnalyzer.ini会配置占用空间的最大内存,默认是1024M,而我们生成的堆文件一般都是超过2G的,所以肯定不够用,所以需要将内存改的大一点,我是改成了8G。
导入后惊喜来了:发现HostsServiceImpl类的对象,占用了1G内存!mygod!剩下的问题就是如何去优化HostsServiceImpl的对象生成了。
四、描述
-
Histogram可以列出内存中的对象,对象的个数以及大小。
-
Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。
-
Top consumers通过图形列出最大的object。
-
Leak Suspects通过MA自动分析泄漏的原因。
五、重点关心:Top consumers之按包名看占用,根据包我们知道哪些公共用的到jar或自己的包占用
如下红框是自己的代码类占用情况,重点优化类
六、linux mat:非windows
以下以transfer的一台 ……253.69 机器为例,mat工具在/data/tools目录下。
1、首先解压mat工具包:MemoryAnalyzer-1.9.2.20200115-linux.gtk.x86_64.zip
2、修改MemoryAnalyzer.ini,将占用内存调大一点,至少大于生成的hprof文件大小;
3、生成hprof文件: jmap -dump:format=b,file=jvm.hprof [进程ID]
4、利用mat-linux分析hprof文件:./ParseHeapDump.sh ./jvm.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components
5、第四步命令执行大约需要20分钟(主要还是看dump文件大小,越大则时间越长,例如,vps-cron的dump文件是20G,分析用了40分钟),执行完会生成如下三个zip文件,直接下载到本地查看即可
关于时间,我再补充下,青云上次给我看个问题,我试了下分析只花了1分钟,16G,所以时间上不知道和哪些因素有关
6、可以看的点
以上生成的文件,把jvm_Leak_Suspects.zip下载到本地,解压
打开index.html:
JVM调优之玩转MAT分析内存泄漏_飘落的羽毛的博客-CSDN博客_mat线程分析
点击See stacktrace,可以看到堆栈的日志详情,如下:
可见是QlbDeployMetircJob.java文件导致的内存问题。
JVM调优之玩转MAT分析内存泄漏_飘落的羽毛的博客-CSDN博客_mat线程分析