Memory Analyzer Tools 使用说明
zhyea robin
1
简介
Eclipse Memory Analyzer是一个功能丰富且轻量的Java堆内存分析工具,可以用来辅助发现内存泄漏减少内存占用。
使用Memory Analyzer来分析生产环境的Java堆转储文件,可以从数以百万计的对象中快速计算出对象的Retained Size,查看是谁在阻止垃圾回收,并自动生成一个Leak Suspect(内存泄露可疑点)报表。
Memory Analyzer有两种使用方式:一种是下载独立版本的MAT,一种是使用嵌入到Eclipse中的MA T 插件。我这里是用的eclipse插件。如果平时用的是其他IDE,可以尝试使用独立版MAT。
概念
1.H eap Dump
Heap Dump是一个Java进程在某个时间点上的内存快照。Heap Dump是有着多种格式的。不过总体上Heap Dump在触发快照的时候都保存了java对象和类的信息。通常在写Heap Dump文件前会触发一次FullGC,所以Heap Dump文件中保存的是FullGC后留下的对象信息。
Memory Analyzer可以用来处理HPROF二进制Heap Dump文件、IBM系统dump文件(经过处理后)、以及来自各个平台上的 IBM portable Heap Dumps (PHD)文件。
一般在Heap Dump文件中可以获取到(这仍然取决于Heap Dump文件的类型)如下信息:
eclipse包下载
对象信息:类、成员变量、直接量以及引用值;
类信息:类加载器、名称、超类、静态成员;
Garbage Collections Roots:JVM可达的对象;
线程栈以及本地变量:获取快照时的线程栈信息,以及局部变量的详细信息。
Heap Dump文件中并不包含内存分配信息,所以通常无法通过Heap Dump文件解决是谁以及在哪里创建了哪些对象这样的问题。
2
2.S hallow or Retained Heap
Shallow Heap表示一个对象消费的内存的总量。对象的每个引用变量会占用32或64bit(取决于操作系统),每个Integer需要占用4byte,每个Long需要占用8byte,诸如此类的其他信息可以自行查询。Shallow heap的值可能是经过了调整的(比如对齐到8,具体取决于Heap Dump文件的格式),以便更好地模拟虚拟机的真实消费情况。
对象X的Retained Set指的是一旦X被垃圾回收后也会随之被GC回收掉的对象的集合。
对象X的retained heap指的是X的retained set中所有对象的shallow heap之和,或者说是因为对象X 而保持alive的内存的大小。
通常来说,shallow heap就是对象自身在堆内存中的大小,而同一个对象的retained heap指的是该对象被垃圾回收后释放的堆内存的大小。
一组leading对象的retained set(如一个特定类的全部对象、一个特定类加载器加载的所有类的全部对象、又或者一串任意的对象)在leading对象集合中的对象全部不可达时被释放掉。Leading对象集的retained set包括这些对象本身和其他的只能通过这些对象访问到的对象。而leading对象集合的retained size指的就是retained set中的全部对象的堆内存之和。如下图:
Minimum Retained Size提供了一种很好的估算retained size的方案。这种方案的计算速度远比获取精确的retained size快得多。因为这种计算方式只依赖于要查看的集合中的对象的数量,而非Heap Dump中对象的数量。
3
3.D ominator Tree
Memory Analyzer提供了一个dominator tree(支配树)的概念来描述对象关系图。将对象引用图转为do
minator tree可以使你很容易地到占用内存最大的一块以及对象之间的依赖关系。如下是对dominator tree的一些正式定义:
如果说对象X支配(dominate)了对象Y,那么在对象关系图中,从起始节点(或者说是根节点)到Y的每一条路径都必须经过X。
对象Y的直接支配者(immediate dominator)X是距离对象Y最近的一个支配者。
Dominator Tree基于对象关系图构建。在Dominator Tree中,每个对象都是它的子节点的直接支配者,所以对象间的依赖关系很容易确认。
Dominator tree有如下几个重要的特征:
X的子树中的对象(也就是由x支配的对象)代表了X的retained set;
如果x是y的直接支配者,那么x的直接支配者同样支配着y,以此类推;
Dominator tree中的边并不直接对应着对象引用图中的对象引用关系。
下图是一张对象引用关系图与dominator tree的对照图:
4.G arbage Collection Roots
一个garbage collection root(简称GCRoot)就是一个可以从堆内存以外访问的对象。以下原因使一个对
象成为GCRoot:
4
System Class
由引导类加载器(bootstrap classloader)或系统类加载器(system classloader)加载的类。比如由rt.jar 加载的全部类,如java.util.*。
JNI Local(局部JNI对象)
native代码编写的局部变量,比如用户自定义的JNI代码或者JVM内部代码。
JNI Global(全局JNI对象)
native代码编写的全局变量,比如用户自定义的JNI代码或者JVM内部代码。
Thread Block
当前活跃的thread block中引用的对象。
Thread
已经启动的,仍未终止的线程。
Busy Monitor(活跃的监控器)
所有调用了wait()、notify()或者进入同步的对象或类(静态方法指的是类,非静态方法时是对象)。举例说如调用了synchronized(Object)或者进入了一个同步的方法。
Java Local
局部变量。指的是仍在线程栈中的方法的输入参数或者创建的局部对象变量。
5

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。