MAT内存分析工具-独立版安装教程及实战教学

MAT是什么?

MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。

安装 MAT

和其他插件的安装非常类似,MAT 支持两种安装方式,一种是“单机版“的,也就是说用户不必安装 Eclipse IDE 环境,MAT 作为一个独立的 Eclipse RCP 应用运行;另一种是”集成版“的,也就是说 MAT 也可以作为 Eclipse 的一部分,和现有的开发平台集成。

集成版的安装需要借助 Update Manager。

------------------------------------------------------------------------------------------------------------------------------------------

由于工作统一需要,使用idea ,此处便直接演示如何安装独立版的MAT分析工具;

下载安装

1、下载地址:https://www.eclipse.org/mat/downloads.php

2、选择Windows(x86_64); ps:根据自己系统下载相对应的版本,我这里下载的是Windows64位版的

3、点击Download;下载完得到一个zip文件,解压后得到mat文件;

4、双击MemoryAnalyzer.exe 打开MAT分析工具;

使用说明:

1、环境:

  运行内存分析器的最低Java版本是 1.8.0

2、使用 Memory Analyzer Tools 获取堆存储

     1、启动进程仅需单击两次。在菜单中,选择“file --> Acquire Heap Dump...”  或者有直接生成好的dump文件,则直接Open Heap Dump ,打开即可;

     2、选择Acquire Heap Dump后。您可以看到正在运行的Java进程;选择你所需要分析的java进程,我这里是选择项目的主模块,因为项目为一个微服务架构体系。您会在底部注意到为堆转储文件自动生成的路径。顺便说一句,我建议选择一个仅包含转储的文件夹,接着finish即可。MAT除了它之外还生成许多其他文件。

标题

3、finish完后,等待堆转储写入磁盘并由MAT解析。对于巨大的Java堆大小,这些操作可能需要一些时间。右下角会有进度条加载

标题

4、加载完后,随后会弹出如下一个新的对话框,提示您进行快速概述,默认选择第一个(泄漏可疑报告),finish即可。 

5、及自动展开如下该窗口,即可进行内存分析;

6、实际上,这种方式要求该进程仍在运行。这是一个调试/开发用例 。

7、介绍一下下面的Actions的几个标签;重点介绍Histogram  Leak Suspects ,其余的暂待研究,

  • Histogram :可以列出内存中的对象,对象的个数以及大小。
  • Dominator Tree:可以列出那个线程,以及线程下面的那些对象占用的空间。
  • Top consumers:通过图形列出最大的object。
  • Leak Suspects:通过MA自动分析泄漏的原因。

------------------------------------------------------------------------------------------------------------------------------------------

1、Histogram :Lists number of instances per class

Histogram是我们使用最多的一个,可以列出内存中的对象,对象的个数及其大小

  1. Class Name : 类名称,java类名
  2. Objects : 类的对象的数量,这个对象被创建了多少个
  3. Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用
  4. Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收到内存的总和

点击Objects  或者 Shallow Heap  可以直观看到,定位到项目上具体哪一个实体所耗内存情况,

 然后单击右键,Lists Objects --->  with incoming references  可以具体看到那些对象引用了。

一般来说,Shallow Heap堆中的对象是它的大小和保留内存大小相同的对象是堆内存的数量时,将释放对象被垃圾收集。
保留设置一组主要的对象,例如一个特定类的所有对象,或所有对象的一个特定的类装入器装入的类或者只是一群任意对象,是释放的组对象如果所有对象的主要设置变得难以接近的。保留设置包括这些对象以及所有其他对象只能通过这些对象。保留大小是总堆大小中包含的所有对象的保留。------摘自eclipse 

关于的详细讲解,建议大家可以查看Shallow heap & Retained heap,这是个很重要的概念。

2、Dominator Tree: List the biggest objects and what they keep alive

我们可以看到session 占比最大;

3、Consumers: Print the most expensive objects grouped by class and by package.

这张图展示的是占用内存比较多的对象的分布,下面是具体的一些类和占用。

 

 按等级分布的类使用情况,其实也就是按使用次数查看,org.apache.shiro.web.session.mgt.DefaultWebSessionManager被排在第一

还有一张图是我们比较关心的,那就是按包名看占用,根据包我们知道哪些公共用的到jar或自己的包占用;

如此分析,就可以看到包和包中哪些类的占用比较高。

4、Leak Suspects : includes leak suspects and a system overview

自动分析内存内存泄漏的原因,可以直接定位到Class,且行数。

在报告上最醒目的就是一张简洁明了的饼图,从这份报告,看到该图深色区域被怀疑有内存泄漏,可以发现整个heap只有442.7M内存,深色区域就占了82%。所以,MAT通过简单的报告就说明了项目是有可疑代码的,具体点开详情来找到类;

在图的下方还有对这个可疑对象的进一步描述。我们可以看到内存是由org.apache.shiro.web.session.mgt.DefaultWebSessionManager 的实例消耗的,org.springframework.boot.loader.LaunchedURLClassLoader 负责这个对象的加载。这段描述非常短,但我相信您已经可以从中找到很多线索了,比如是哪个类占用了绝大多数的内存,它属于哪个组件等等。

接下来,我们应该进一步去分析问题,为什么一个 DefaultWebSessionManager 会占据了系统 82 的内存,谁阻止了垃圾回收机制对它的回收。

接着点击 下方的 Details > ,如下:

a、可以看到 Accumulated Objects by Class in Dominator Tree 【从根元素到内存消耗聚集点的最短路径】

我们可以很清楚的看到整个引用链,内存聚集点是一个拥有大量对象的集合,如果你对代码比较熟悉的话,相信这些信息应该能给你提供一些找到内存泄露的思路了。

接下来,我们再继续看看,这个对象集合里到底存放了什么,为什么会消耗掉如此多的内存。

b、 Accumulated Objects in Dominator Tree 【内存消耗聚集对象信息】

在这张图上,我们可以清楚的看到,这个对象集合中保存了大量ConcurrentHashMap对象的引用,就是它导致的内存泄露。

至此,我们已经拥有了足够的信息去寻找泄露点,回到代码,你会发现原来是session 在暂存token的时候,业务需求,在每调用一次接口,session便要用map存一次token,定时任务的产生,导致项目不到一天便挂了,至此, 问题所导致内存泄露缘由已经找到,具体怎么解决暂代思考。

------------------------------------------------------------------------------------------------------------------------------------------

总结

从上面的例子我们可以看到用 MAT 来进行堆转储文件分析,寻找内存泄露非常简单,尤其是对于新手而言,这是一个很好的辅助分析工具。但是,MAT 绝对不仅仅是一个“傻瓜式”内存分析工具,它还提供很多高级功能,比如 MAT 支持用 OQL(Object Query Language)对 heap dump 中的对象进行查询,支持对线程的分析等,有关这些功能的使用可以参考 MAT 的帮助文档。

如果文章对您有所帮助,就给文章的右上角或者文章的末尾给怂怂一个赞吧!(づ ̄ 3 ̄)づ

如果喜欢怂怂写的分享文,就给阿怂点个关注吧!(๑′ᴗ‵๑)づ╭❤~

为什么创建出了 大量hashmap 却不会被GC回收掉或者垃圾回收率远远低于创建速率?如果有大佬知道此问题如何解决或者熟悉GC回收机制的,就请给阿怂留下您的解决办法或者思路吧,阿怂我感激不尽,头都快要被挠秃了o(╥﹏╥)o,太难了。

发布了85 篇原创文章 · 获赞 197 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/weixin_43970743/article/details/103762862
今日推荐