Eclipse--Memory--Analyzer中文教程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

MemoryAnalyzer使用文档1致一思维翻译整理MemoryAnalyzerTools使用说明zhyearobinMemoryAnalyzer使用文档2致一思维翻译整理简介EclipseMemoryAnalyzer是一个功能丰富且轻量的Java堆内存分析工具,可以用来辅助发现内存泄漏减少内存占用。使用MemoryAnalyzer来分析生产环境的Java堆转储文件,可以从数以百万计的对象中快速计算出对象的RetainedSize,查看是谁在阻止垃圾回收,并自动生成一个LeakSuspect(内存泄露可疑点)报表。MemoryAnalyzer有两种使用方式:一种是下载独立版本的MAT,一种是使用嵌入到Eclipse中的MAT插件。我这里是用的eclipse插件。如果平时用的是其他IDE,可以尝试使用独立版MAT。概念1.HeapDumpHeapDump是一个Java进程在某个时间点上的内存快照。HeapDump是有着多种格式的。不过总体上HeapDump在触发快照的时候都保存了java对象和类的信息。通常在写HeapDump文件前会触发一次FullGC,所以HeapDump文件中保存的是FullGC后留下的对象信息。MemoryAnalyzer可以用来处理HPROF二进制HeapDump文件、IBM系统dump文件(经过处理后)、以及来自各个平台上的IBMportableHeapDumps(PHD)文件。一般在HeapDump文件中可以获取到(这仍然取决于HeapDump文件的类型)如下信息:对象信息:类、成员变量、直接量以及引用值;类信息:类加载器、名称、超类、静态成员;GarbageCollectionsRoots:JVM可达的对象;线程栈以及本地变量:获取快照时的线程栈信息,以及局部变量的详细信息。HeapDump文件中并不包含内存分配信息,所以通常无法通过HeapDump文件解决是谁以及在哪里创建了哪些对象这样的问题。MemoryAnalyzer使用文档3致一思维翻译整理2.ShalloworRetainedHeapShallowHeap表示一个对象消费的内存的总量。对象的每个引用变量会占用32或64bit(取决于操作系统),每个Integer需要占用4byte,每个Long需要占用8byte,诸如此类的其他信息可以自行查询。Shallowheap的值可能是经过了调整的(比如对齐到8,具体取决于HeapDump文件的格式),以便更好地模拟虚拟机的真实消费情况。对象X的RetainedSet指的是一旦X被垃圾回收后也会随之被GC回收掉的对象的集合。对象X的retainedheap指的是X的retainedset中所有对象的shallowheap之和,或者说是因为对象X而保持alive的内存的大小。通常来说,shallowheap就是对象自身在堆内存中的大小,而同一个对象的retainedheap指的是该对象被垃圾回收后释放的堆内存的大小。一组leading对象的retainedset(如一个特定类的全部对象、一个特定类加载器加载的所有类的全部对象、又或者一串任意的对象)在leading对象集合中的对象全部不可达时被释放掉。Leading对象集的retainedset包括这些对象本身和其他的只能通过这些对象访问到的对象。而leading对象集合的retainedsize指的就是retainedset中的全部对象的堆内存之和。如下图:MinimumRetainedSize提供了一种很好的估算retainedsize的方案。这种方案的计算速度远比获取精确的retainedsize快得多。因为这种计算方式只依赖于要查看的集合中的对象的数量,而非HeapDump中对象的数量。MemoryAnalyzer使用文档4致一思维翻译整理3.DominatorTreeMemoryAnalyzer提供了一个dominatortree(支配树)的概念来描述对象关系图。将对象引用图转为dominatortree可以使你很容易地找到占用内存最大的一块以及对象之间的依赖关系。如下是对dominatortree的一些正式定义:如果说对象X支配(dominate)了对象Y,那么在对象关系图中,从起始节点(或者说是根节点)到Y的每一条路径都必须经过X。对象Y的直接支配者(immediatedominator)X是距离对象Y最近的一个支配者。DominatorTree基于对象关系图构建。在DominatorTree中,每个对象都是它的子节点的直接支配者,所以对象间的依赖关系很容易确认。Dominatortree有如下几个重要的特征:X的子树中的对象(也就是由x支配的对象)代表了X的retainedset;如果x是y的直接支配者,那么x的直接支配者同样支配着y,以此类推;Dominatortree中的边并不直接对应着对象引用图中的对象引用关系。下图是一张对象引用关系图与dominatortree的对照图:4.GarbageCollectionRoots一个garbagecollectionroot(简称GCRoot)就是一个可以从堆内存以外访问的对象。以下原因使一个对象成为GCRoot:MemoryAnalyzer使用文档5致一思维翻译整理SystemClass由引导类加载器(bootstrapclassloader)或系统类加载器(systemclassloader)加载的类。比如由rt.jar加载的全部类,如java.util.*。JNILocal(局部JNI对象)native代码编写的局部变量,比如用户自定义的JNI代码或者JVM内部代码。JNIGlobal(全局JNI对象)native代码编写的全局变量,比如用户自定义的JNI代码或者JVM内部代码。ThreadBlock当前活跃的threadblock中引用的对象。Thread已经启动的,仍未终止的线程。BusyMonitor(活跃的监控器)所有调用了wait()、notify()或者进入同步的对象或类(静态方法指的是类,非静态方法时是对象)。举例说如调用了synchronized(Object)或者进入了一个同步的方法。JavaLocal局部变量。指的是仍在线程栈中的方法的输入参数或者创建的局部对象变量。MemoryAnalyzer使用文档6致一思维翻译整理NativeStacknative代码中的输入输出参数,如用户自定义的JNI代码,或者JVM内置代码。通常是在这样的情况下:一个方法中有native代码参与,作为这个方法的参数的对象就成了GCRoot。比如说用在文件操作或者网络传输中的IO方法的参数、或者用在反射中的参数。Finalizable进入等待队列,等待自己的Finalizer执行的对象。Unfinalized一个有finalize方法的对象,但是尚未被finalize也没有进入等待执行finalize的队列时。Unreachable其他GCRoot皆不可达的对象,但是也不会被MAT标记为GCRoot。这种对象不会被纳入分析的范围。JavaStackFrame(Java栈帧)Stackframe(堆栈帧)是一个为函数保留的区域,用来存储关于参数、局部变量和返回地址的信息。只有在解析dump文件时将之视为一个对象来处理,才会认为其是一个GCRoot。Unknown未知类型的root对象。一些dump文件,如IBMPortableHeapDump文件,其中并不包含root信息。MAT在解析这一类文件时,如果发现某些对象不存在任何引用信息或者对任何GCRoot均不可达,那么这些对象就会被认为是未知类型的GCRoot。这样可以保证GCRoot持有dump中的所有对象信息。5.Incomming&OutgoingReference简言之,IncommingReference指的是引用当前对象的外部对象;OutgoingReference指的是当前对象引MemoryAnalyzer使用文档7致一思维翻译整理用的外部对象。对象的incommingreference保证对象处于alive从而免于被垃圾回收掉。Outgoingreference则展示了对象的具体内容,有助于我们发现对象的用处。基础教程这里的基础教程可以用来作为熟悉EclipseMemoryAnanlyzer的一个出发点。第一步:获取HeapDump文件MemoryAnalyzer主要基于HeapDump文件工作。HeapDump文件中包含了在某个指定时间点上所有alive状态的java对象的信息。现在所有Java虚拟机都有写HeapDump文件的功能,但是具体的步骤随着提供商、版本以及操作系统的不同而有些差别。在这个教程中会尝试使用windows下的java8和jconsole来下载HeapDump文件。使用java8启动一个应用,打开JAVA_HOME/bin/jconsole.exe,在jconsole中选择正在运行的应用(在这个例子中选择的是eclipse,虽然进程名称为空,但是通过重启eclipse可以确认)。建立连接后,选择页签MBean,执行com.sun.management.HotSpotDiagnostic下的操作dumpHeap。MemoryAnalyzer使用文档8致一思维翻译整理第一个参数p0是要获取的dump文件的完整路径名,记得文件要以.hprof作为扩展名(要在MemoryAnalysisPerspective下打开扩展名必须是这个)。如果我们只想获取live的对象,第二个参数p1需要保持为true。建议将导出的dump文件保存到一个独立的文件夹,在接下来的分析中会通过这个文件创建很多图表文件。第二步:Overview(概览)在eclipse上通过File–OpenFile来打开dump文件,之后会直接进入Overview页。当然也可以打开MemoryAnalysisPerspective,这个通常需要手动调整下:MemoryAnalyzer使用文档9致一思维翻译整理之后在弹出框中选择MemoryAnalysis即可:在MemoryAnalysisPerspective下还可以使用File-OpenHeapDump打开dump文件。在MemoryAnalysisPerspective下Overview是这样子的:MemoryAnalyzer使用文档10致一思维翻译整理在右侧窗口上方的位置可以看到heapDump的size,以及类、对象和类加载器的数量。右侧窗口中最醒目的饼图直观地显示了dump中最大的几个对象。鼠标光标划过饼图中代表某个对象的区块时可以在左侧Inspector窗口中看到对象的细节,在区块上点击鼠标左键可以通过菜单项钻取到关于其对应的对象更多的细节。第三步:TheHistogram(直方图)在工具栏中选择histogram可以查看每个类的实例的数量,以及shallowsize和retainedsize。MemoryAnalyzer默认展示了每个对象的retainedsize。然而同一组对象(在这里指的是同一个类的所有MemoryAnalyzer使用文档11致一思维翻译整理实例)的retainedsize仍然需要计算。要估算所有行的retainedsize,可以使用工具栏中的。此外,也可以单独选择几行,使用右键菜单中的对应选项来进行计算(如果retainedheap已经有值的话计算将不会起到作用)。在Histogram中使用右键菜单可以深入钻取选定行所代表的对象的信息。比如说,可以使用右键菜单查看对象的incommingreference和Outgoingreference,可以按对象值的属性进行分组,也可按集合的size对之进行分组…MemoryAnalyzer的一个强大之处就在于使用者可以从多个角度钻取对象信息进行分析。所以在需要的时候,可以尝试对象进行切片和钻取。查看对象的Outgoingreference:另一个重要的功能是按classload

1 / 93
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功