没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Memory Analyzer 使用文档
2
致一思维翻译整理
简介
Eclipse Memory Analyzer 是一个功能丰富且轻量的 Java 堆内存分析工具,可以用来辅助发现内存泄漏减
少内存占用。
使用 Memory Analyzer 来分析生产环境的 Java 堆转储文件,可以从数以百万计的对象中快速计算出对
象的 Retained Size,查看是谁在阻止垃圾回收,并自动生成一个 Leak Suspect(内存泄露可疑点)报表。
Memory Analyzer 有两种使用方式:一种是下载独立版本的 MAT,一种是使用嵌入到 Eclipse 中的 MAT
插件。我这里是用的 eclipse 插件。如果平时用的是其他 IDE,可以尝试使用独立版 MAT。
概念
1. Heap 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 文件的类型)如下信息:
对象信息:类、成员变量、直接量以及引用值;
类信息:类加载器、名称、超类、静态成员;
Garbage Collections Roots:JVM 可达的对象;
线程栈以及本地变量:获取快照时的线程栈信息,以及局部变量的详细信息。
Heap Dump 文件中并不包含内存分配信息,所以通常无法通过 Heap Dump 文件解决是谁以及在哪里创
建了哪些对象这样的问题。
Memory Analyzer 使用文档
3
致一思维翻译整理
2. Shallow 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 中对
象的数量。
Memory Analyzer 使用文档
4
致一思维翻译整理
3. Dominator Tree
Memory Analyzer 提供了一个 dominator tree(支配树)的概念来描述对象关系图。将对象引用图转为
dominator 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. Garbage Collection Roots
一个 garbage collection root(简称 GCRoot)就是一个可以从堆内存以外访问的对象。以下原因使一个对
象成为 GCRoot:
Memory Analyzer 使用文档
5
致一思维翻译整理
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
局部变量。指的是仍在线程栈中的方法的输入参数或者创建的局部对象变量。
剩余92页未读,继续阅读
资源评论
- qq_298192532019-12-08灰常详细的教程
ddssingsong
- 粉丝: 278
- 资源: 27
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功