下载独立安装版 Eclipse Memory Analyzerhttps://www.eclipse.org/mat/
写了些啥?
Eclipse Memory Analyzer 的介绍和使用说明.基本上是帮助文档的中文翻译版本
什么是 Heap Dump ?
Heap dump 的中文名称是 堆转储.
堆转储是Java进程在某个时间点的内存快照。持久化此数据有不同的格式,根据格式的不同,它可能包含不同的信息片段,但通常快照包含关于触发快照时堆中的java对象和类的信息。通常,在写堆转储之前会触发一个完整的GC,因此它包含关于剩余对象的信息。
可以在堆转储中找到的典型信息(取决于堆转储类型)是:
所有对象
类、字段、原始值和引用
所有类
类加载器,名称,超类,静态字段
垃圾收集根
被定义为JVM可以访问的对象
线程堆栈和本地变量
快照时刻的线程调用堆栈,以及关于本地对象的每帧信息
浅堆与保留堆(shallow vs Retained Heap)
浅堆是一个对象自身消耗的内存。一个对象每个引用需要32位或64位(取决于OS体系结构),Integer 4个字节,Long 8个字节等。根据堆转储格式,可以调整大小(例如,对齐到8字节等等),以更好地模拟VM的实际消耗。
Retained Set of X是当X被垃圾收集时由GC移除的对象集。
Retained heap of X 是Retained Set 中所有对象的浅堆大小的总和,即由X持有的存活内存。
一般来说,对象的shallow heap是其在堆中的大小,并且同一对象的retained size是当对象被垃圾收集时将释放的堆内存量。
一组对象的Retained Set (包括这些对象以及只能通过这些对象访问的所有其他对象) 的大小是包含在集合中的所有对象的总堆大小。
例如上图的堆转储文件的 domainator_tree 图 . ArrayList 持有 两个 byte[] 的数组.
代码形式为 Lis