Java堆(heanp dump)文件是一个纯二进制文件,咱们用肉眼去看肯定是不现实的。所以咱们得借助特定的堆分析器来对dump文件做相应的分析。这里我们选用Eclipse Memory Analyzer(MAT)来作为heap dump文件的分析工具。接下来咱们对MAT工具做一个简单的介绍。方便咱们后续分析Java堆(heap dump)
Eclipse Memory Analyzer Tool(简称MAT)是一个非常强大的的内存分析工具,可以帮助我们分析堆内存,找到内存泄露的地方,减少内存消耗。MAT除了可以作为Eclipse的插件使用。官方也提供了独立的安装版本,我们用IDEA用的比较多,所以使用独立的安装版本,直接进入下载页面 https://www.eclipse.org/mat/downloads.php ,下载适合自己的版本。为了方便大家我这里提前下载了一份Window 64位的安装包 https://download.csdn.net/download/wuyuxing24/12302636
在介绍MAT工具之前我们先介绍几个常用术语。在MAT工具中这几个术语经常出现:
Shallow Size: 对象自身占用的内存大小。
Retained Size: 对象本身的Shallow Size + 该对象直接或间接引用到的对象的Shallow Size。(也就是说Retained Size就是该对象被GC之后所能回收的内存的总和)
GC Roots: 是一组必须活跃的引用。GC会收集那些不是GC Roots且没有被GC roots引用的对象。基本思路就是通过一系列名为GC Roots 的对象作为起始点开始向下搜索。如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。换句话说就是能被遍历到的(可到达的)对象就被判定为存活,没有被遍历到的就自然被判定为死亡。
哪些对象可以作为Gc Roots的对象:
虚拟机(栈帧中的本地变量表)中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI(即一般说的native方法)中引用的对象
image.png
一 MAT结构介绍
MAT.png
1.1 区域一:Inspector区域
用于展示指定对象的详细信息(选定一个对象的时候),从上到下依次是:内存地址、加载器名称、包名、对象名称、对象所属类的父类、对象所属类的加载器对象对象的堆内存大小(shallow size)、保留大小(retained size)、gc roots信息。
1.2 区域二:Inspector区域下方的区域
展示对象的一些属性信息、类层级信息。
1.3 区域三:常用工具栏区域
常用工具按钮从左到右依次是:概览(Overview)、类直方图(Histogram)、支配树(Dominator Tree)、OQL查询、线程视图、报告相关、详细功能(提供了一些更细致的分析能力)。
1.4 区域四:功能视图区域
根据选择的功能不同,该区域显示对应功能的详细信息。比如我们想看Overview信息(点击区域三常用工具栏的第一个按钮)该区域就会展示heap dump Overview对应的信息。
二 MAT视图,功能
2.1 Overview视图
MAT-Actions-Overview.png
进入Overview视图
使用MAT打开一个heap dump文件,解析完成后,默认就会进入Overview视图页面。
工具栏中点击Overview按钮(区域三常用工具栏的第一个按钮)展示Overview对应的信息。
image.png
Overview视图使用
Overview视图界面包括两个部分:一个是对heap dump文件的一个大致的分析,包括占用内存大小,类个数,对象个数,类加载器个数,及用饼图的方式展示对象retained size信息、另一个是提供了一些常用的入口,包括视图入口(Actions)、常用的分析报告入口(Reports)、MAT使用教程入口(Step By Step)]。
关于Overview视图区域,我们得关注点应该放在饼图上(根据retained size 对所有对象做排序,使用拼图演示结果)。我们可以方便的看到哪些对象的ratained size比较大(如果某个对象的retained size特别大。我们就要特别小心了,可能有问题了)。当我们鼠标点击每个饼图区域(对象)的时候,会弹出一个菜单,我们还可以查看相应对象的详细信息。这个菜单包含的额内容有:
点击Overview饼