1、MAT 简介
MAT是一款非常强大的内存分析工具,只要获得了反映当前设备内存映像的hprof文件,通过MAT打开就可以直观地分析jvm内存信息。
2、安装和设置
下载地址
Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation
安装遇到的坑m1 芯片下安装可能不成功,可以使用其他人安装好的,从应用程序中压缩的mat 文件(已经上传到 10.110.6.24 /data/mat.app.zip )(吝哲解决过)
配置mat 堆内存大小 修改配置文件 /Applications/mat.app/Contents/Eclipse/MemoryAnalyzer.ini
3、生成并下载堆文件 (生成后请压缩后再下载)
jmap -dump:live,format=b,file=heap***.hprof pid
4、使用 mat 查看堆文件信息
用MAT打开一个hprof文件后一般会进入如下的overview界面,overview界面会以饼图的方式显示当前消耗内存最多的几类对象,可以使我们对当前内存消耗有一个直观的印象。
1)Histogram (柱状图)
通过柱状图界面,可以查找引用选中对象的对象集合以及选中对象所引用的对象集合。
2)Dominator Tree (支配树) 支配树可以直观地反映一个对象的retained heap,这里我们首先要了解两个概念,shallow heap和retained heap:
- shallow heap:指的是某一个对象所占内存大小。
- retained heap:指的是一个对象的retained set所包含对象所占内存的总大小。
浅堆指对象本身占用的内存,不包括其内部引用对象的大小。一个对象的深堆指只能通过该对象访问到的(直接或间接)所有对象的浅堆之和,即对象被回收后,可以释放的真实空间。
支配树体现了对象实例间的支配关系。在对象引用图中,所有指向对象B的路径都经过对象A,则认为对象A支配对象B。如果对象A是离对象B最近的一个支配对象,则认为对象A为对象B的直接支配者。支配树是基于对象间的引用图所建立的,它具有以下基本性质:
- 对象A的子树(所有被对象A支配的对象集合)表示对象A的保留集(retainedset)。
- 如果对象A支配对象B,那么对象A的直接支配者也支配对象B。
- 支配树的边与对象引用图的边不直接对应。
下图中左图表示对象引用图,右图表示左图所对应的支配树。对象A和B由根对象直接支配,由于在到对象C的路径中可以经过A,也可以经过B,因此对象C的直接支配者也是根对象。对象F与对象D相互引用,因为到对象F的所有路径必然经过对象D,因此对象D是对象F的直接支配者。而到对象D的所有路径中,必然经过对象C,即使是从对象F到对象D的引用,从根节点出发,也是经过对象C的,所以对象D的直接支配者为对象C。
3)OQL(Object Query Language)
4)Leak Suspects(内存泄漏检测)
MAT提供了自动检测内存泄漏,以及统计堆快照内对象分布情况的工具。下图展示了内存泄漏检测工具的使用方法。选择菜单中的Leak Suspects命令,MAT会自动生成一份报告。这份报告罗列了系统内可能存在内存泄漏的问题点(一般情况下解决这些 Problem 就可以了)。
5)Top Comment 最大对象报告
系统中占用内存最大的几个对象,往往是解决系统性能问题的关键所在。如果应用程序发生内存泄漏,那么泄漏的对象通常会在堆快照中占据很大的比重。因此,查看和分析堆快照中最大的对象具有较高的价值。