欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Eclipse 内存分析器MAT(二)基础概念 博客分类: Eclipse eclipseMAT 

程序员文章站 2024-03-22 22:47:58
...
1.Heap Dump(java 堆dump文件)
  Heap Dump代表的是java处理器(jvm)在特定时间点对应的内存快照(如出现OutOfMemoryError的时候)。根据生成dump文件时指定的格式以及采用的jvm类型,dump文件中可能会包含着不同的信息,但通常来说,里面都会包含在快照生成时java heap中的类和对象。在一般情况下,在触发快照生成前都会有一个Full GC处理,所以dump文件中只会保留无法被垃圾回收机制回收的对象。
在大多数情况下dump中包含如下内容
  • 所有的对象
  •   类、字段、原生数据(int、double等)、引用
  • 所有的类
  •   类加载器、名称、超类、静态字段
  • 垃圾回收根对象
  •   指能通过jvm到达的对象(后面会详细说明)
  • 线程栈河本地变量
  •   快照生成时所有线程中的堆栈信息、本地变量的桢信息

dump文件中不包含对象地址的分配信息,所以不能通过dump文件分析出对象是被哪个对象创建的,也无法查出对象是在什么时候创建的。
2.Shallow Heap 和 Retained Heap
  • Shallow heap 代表的是对象X自身占用的内存,如一个引用占用32或64bit,一个integer占4byte等。
  • Retained set 代表的是对象X被垃圾回收器回收后能被GC从内存中移除的所有对象集合,例如在对象树中Y只能通过X才能访问到,那么Y就是属于X的Retained set中的一员。
  • Retained heap 代表的是对象X对应的Retained set中所有对象的Shallow heap之和,也就是由于对象X的存在而占用的内存大小
  • leading set 一个对象集合的Retained set(例如一个特定类的所有对象集、一个特定类加载器加载的类对应对象集)指的是当这些对象集合中的对象都变的不可访问时释放的总的对象集合,因此这个Retained set即包含这个对象集合中的对象,也包含哪些只能通过这个集合中的对象才能访问的对象。对象的Retained heap就是这个Retained set中的所有对象的Shallow Heap。

总的来说,一个对象的shallow heap就是这个对象自身在堆中的大小而同一个对象的Retained heap就是这个对象被GC回收后释放的总的内存大小。而leading set 就是这个集合中所有对象对应的Retained set。
下面用一张图来说明

Eclipse 内存分析器MAT(二)基础概念
            
    
    博客分类: Eclipse eclipseMAT 

其中A和B是GC root对象,如方法参数对象,本地创建的native对象,用来执行wait()、notify()、synchronized()方法的对象等。
leading set Retained set
G G
E1,E2 E1,E2,G,I
C C,D,E1,E2,F,G,H,I
A,B A,B,C,D,E1,E2,F,G,H,I

3.Dominator Tree
MAT提供一个heap dump中的对象树对应的Dominator Tree,通过将对象树转换成Dominator Tree能帮助我们快速的发现占用内存最大的块,也能帮我们分析对象之间的依赖关系。几个术语定义如下
  • 对象X Dominator(支配)对象Y,当且仅当在对象树中所有到达Y的路径都必须经过X
  • 对象Y的直接Dominator,是指在对象树中距离Y最近的Dominator
  • Dominator tree利用对象树构建出来。在Dominator tree中每一个对象都是他的直接Dominator的子节点。

Dominator tree具有下面几个主要属性
  • 对象X的sub-tree(被X 支配的对象)代表着X的Retained set
  • 如果X直接支配着Y对象,那么X的直接支配者也支配着Y对象,依次类推
  • Dominator tree并不直接对应着对象树中的引用关系

对象树和Dominator tree的对应关系如下

Eclipse 内存分析器MAT(二)基础概念
            
    
    博客分类: Eclipse eclipseMAT 
4.Garbage Collection Roots(GC root)
一个GCroot指的是可以从堆外部访问的对象,有以下原因可以使一个对象成为GCroot对象
  • System Class
  • 通过bootstrap/system 类加载器加载的类,如rt.jar中的java.util.*
  • JNI Local
  • Local variable in native code, such as user defined JNI code or JVM internal code.
  • JNI Global
  • Global variable in native code, such as user defined JNI code or JVM internal code.
  • Thread Block
  • Object referred to from a currently active thread block.
  • Thread
  • 一个启动的还没有停止的线程
  • Busy Monitor
  • 调用了wait()、notify()方法,或者是同步对象,例如调用synchronized(Object) 或者进入一个synchronized方法后的当前对象
  • Java Local
  • 本地变量,例如方法的输入参数或者是方法内部创建的仍在线程堆栈里面的对象
  • Native Stack
  • In or out parameters in native code, such as user defined JNI code or JVM internal code. This is often the case as many methods have native parts and the objects handled as method parameters become GC roots. For example, parameters used for file/network I/O methods or reflection.
  • Finalizable
  • An object which is in a queue awaiting its finalizer to be run.
  • Unfinalized
  • An object which has a finalize method, but has not been finalized and is not yet on the finalizer queue.
  • Unreachable
  • An object which is unreachable from any other root, but has been marked as a root by MAT to retain objects which otherwise would not be included in the analysis.
  • Java Stack Frame
  • A Java stack frame, holding local variables. Only generated when the dump is parsed with the preference set to treat Java stack frames as objects.
  • Unknown

  • Eclipse 内存分析器MAT(二)基础概念
            
    
    博客分类: Eclipse eclipseMAT 
  • 大小: 8.2 KB
  • Eclipse 内存分析器MAT(二)基础概念
            
    
    博客分类: Eclipse eclipseMAT 
  • 大小: 20.9 KB
相关标签: eclipse MAT