MAT(Memory Analyzer Tool)工具使用

插件更新地址:
http://download.eclipse.org/mat/1.0/update-site/

先调用jdk的工具得到heap使用情况

我安装的是jdk1.6

C:/>Java -version

java version "1.6.0_11"

Java(TM) SE Runtime Environment (build 1.6.0_11-b03)

Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing)

调用jdk工具jps查看当前的java进程

C:/>jps

3504 Jps

3676 Bootstrap

3496 org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar

调用jmap工具得到信息

C:/>jmap -dump:format=b,file=heap.bin 3676

Dumping heap to C:/heap.bin ...

Heap dump file created

这时,我们的C盘根目录,就生成了heap.bin文件,用eclipse的file---->open打开这个文件,首先是一个启动图:

这里可以选择查看

1、内存泄露报表,自动检查可能存在内存泄露的对象,通过报表展示存活的对象以及为什么他们没有被垃圾收集;

2、对象报表,对可颖对象的分析,如字符串是否定义重了,空的collection、finalizer以及弱引用等。

我这里选择的是查看内存报表,以下是截的简略图:

 

通过报表展示,蛮清楚的,下面还有详细的说明,这里就没有帖图了,有兴趣的可以继续探究。




当成功启动MAT后,通过菜单选项“File->Open heap dump...”打开指定的dump文件后,将会生成Overview选项,在概况中可以初步查看占用内存最多的几个类以及对应的一些属性、引用层次和统计信息

使用MAT(Memory Analyzer Tool)分析内存泄漏

在Overview选项中,以饼状图的形式列举出了程序内存消耗的一些基本信息,其中每一种不同颜色的饼块都代表了不同比例的内存消耗情况。如果说 需要定位内存泄露的代码点,我们可以通过Dominator Tree菜单选项来进行排查(MAT工具仅仅只是一个辅助,分析OutofMemory并不存在一个固定的方式和准则,因此仔细观察和分析才能够找到问题 所在)

使用MAT(Memory Analyzer Tool)分析内存泄漏

Histogram图表中主要统计了消耗占比较高的类的实例数量及占用空间,Shallow Size: 对象自身占用的内存大小,不包括它引用的对象Retained Size: 当前对象大小 + 当前对象直接或间接引用的对象大小的总和 - 被GC Roots直接或间接引用的对象大小的总和

使用MAT(Memory Analyzer Tool)分析内存泄漏

Top Consumers图表可以更直观地看到内存消耗占比最多的类,由于很多类都囊括在ClassLoader中,因此还需要进一步查看引用的层级。如果一次观察的结果不够明显,可以对比不同服务器(不同组)、不同时间点的内存使用情况,进一步缩小排查范围。

使用MAT(Memory Analyzer Tool)分析内存泄漏

List objects with outgoing/incoming references 根据引用层级查看问题根源

使用MAT(Memory Analyzer Tool)分析内存泄漏

Leak suspects,MAT可以自动生成可疑泄露点的报告,能够从以下几点全面分析问题:

  • Shortest Paths To the Accumulation Point
  • Accumulated Objects in Dominator Tree
  • Accumulated Objects by Class in Dominator Tree
  • All Accumulated Objects by Class

使用MAT(Memory Analyzer Tool)分析内存泄漏


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章