总结:JVM堆内存调优之MAT

一、介绍

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=heap-dump.bin <pid>

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线程分析

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值