`

Eclipse Memory Analyzer tool(MAT)使用详细说明

 
阅读更多

在本文中,将介绍MAT如何根据heapdump分析泄漏根源。由于测试范例可能过于简单,很容易找出问题,但我期待借此举一反三。

一开始不得不说说ClassLoader,本质上,它的工作就是把磁盘上的类文件读入内存,然后调用java.lang.ClassLoader.defineClass方法告诉系统把内存镜像处理成合法的字节码。Java提供了抽象类ClassLoader,所有用户自定义类装载器都实例化自ClassLoader的子类。systemclass loader在没有指定装载器的情况下默认装载用户类,在Sun Java 1.5中既sun.misc.Launcher$AppClassLoader。更详细的内容请参看下面的资料。

准备heap dump
请看下面的Pilot类,没啥特殊的。

/**
 * Pilot class
 * @author rosen jiang
 */
package org.rosenjiang.bo;

public class Pilot{
    
    String name;
    int age;
    
    public Pilot(String a, int b){
        name = a;
        age = b;
    }
}


然后再看OOMHeapTest类,它是如何撑破heapdump的。

/**
 * OOMHeapTest class
 * @author rosen jiang
 */
package org.rosenjiang.test;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.rosenjiang.bo.Pilot;

public class OOMHeapTest {
    public static void main(String[] args){
        oom();
    }
    
    private static void oom(){
        Map<String, Pilot> map = new HashMap<String, Pilot>();
        Object[] array = new Object[1000000];
        for(int i=0; i<1000000; i++){
            String d = new Date().toString();
            Pilot p = new Pilot(d, i);
            map.put(i+"rosen jiang", p);
            array[i]=p;
        }
    }
}


是的,上面构造了很多的Pilot类实例,向数组和map中放。由于是StrongRefGC自然不会回收这些对象,一直放在heap中直到溢出。当然在运行前,先要在Eclipse中配置VM参数-XX:+HeapDumpOnOutOfMemoryError。好了,一会儿功夫内存溢出,控制台打出如下信息。

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid3600.hprof 
Heap dump file created [78233961 bytes in 1.995 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space



java_pid3600.hprof
既是heap dump,可以在OOMHeapTest类所在的工程根目录下找到。

 

MAT安装

话分两头说,有了heap dump还得安装MAT

MAT支持两种安装方式,一种是独立版本,用户不必安装 EclipseIDE 环境,MAT 作为一个独立的 EclipseRCP 应用运行;另一种是插件版本,也就是说MAT 可以作为 EclipseIDE 的一个插件,和Eclipse开发平台集成。

独立版本,下载地址:http://www.eclipse.org/mat/downloads.php

下载的zip包,解压即可使用。下载页图示如下:



 

eclipse IDE集成安装过程,可参看以下文章:

http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/index.html

安装完成后,为了更有效率的使用 MAT,我们可以配置一些环境参数。因为通常而言,分析一个堆转储文件需要消耗很多的堆空间,为了保证分析的效率和性能,在有条件的情况下,我们会建议分配给 MAT 尽可能多的内存资源。你可以采用如下两种方式来分配内存更多的内存资源给 MAT

一种是修改启动参数 MemoryAnalyzer.exe-vmargs -Xmx4g

另一种是编辑文件 MemoryAnalyzer.ini,在里面添加类似信息 -vmargs– Xmx4g

说明:

1. MemoryAnalyzer.ini中的参数一般默认为-vmargs– Xmx1024m,这就够用了。假如你机器的内存不大,改大该参数的值,会导致MemoryAnalyzer启动时,报错:Failed to create the Java Virtual Machine。

2.当你导出的dump文件的大小大于你配置的1024m(说明1中,提到的配置:-vmargs– Xmx1024m),MAT输出分析报告的时候,会报错:An internal error occurred during: "Parsing heap dump from XXX”。适当调大说明1中的参数即可。


至此,MAT 就已经成功地安装配置好了,Eclipse的左上角有Open Heap Dump按钮,按照刚才说的路径找到java_pid3600.hprof文件并打开

先检查一下 MAT生成的一系列文件:(截图来自另一个例子)



 

可以看到 MAT工具提供了一个很贴心的功能,将报告的内容压缩打包到一个 zip文件,并把它存放到原始堆转储文件的存放目录下,这样如果您需要和同事一起分析这个内存问题的话,只需要把这个小小的 zip包发给他就可以了,不需要把整个堆文件发给他。并且整个报告是一个 HTML格式的文件,用浏览器就可以轻松打开。

使用MAT打开dump文件,等待一会后,会弹出向导界面,保持默认设置,直接点Finish即是分析内存泄露问题。在点击Finish后,会出现overview界面,您可以点击工具栏上的 Leak Suspects 菜单项来生成内存泄露分析报告,也可以直接点击饼图下方的 Reports->Leak Suspects链接来生成报告。如图:



MAT工具分析了heap dump后在界面上非常直观的展示了一个饼图,该图深色区域被怀疑有内存泄漏,可以发现整个heap64M内存,深色区域就占了99.5%。接下来是一个简短的描述,告诉我们main线程占用了大量内存,并且明确指出system class loader加载的"java.lang.Thread"实例有内存聚集,并建议用关键字"java.lang.Thread"进行检查。所以,MAT通过简单的两句话就说明了问题所在,就算使用者没什么处理内存问题的经验。在下面还有一个"Details"链接,在点开之前不妨考虑一个问题:为何对象实例会聚集在内存中,为何存活(而未被GC)?是的——Strong Ref,那么再走近一些吧。如图:


 
点击了"Details"链接之后,除了在上一页看到的描述外,还有Shortest Paths To the Accumulation PointAccumulated Objects部分,这里说明了从GC root到聚集点的最短路径,以及完整的reference chain。观察Accumulated Objects部分,java.util.HashMapjava.lang.Object[1000000]实例的retained heap(size)最大,在上一篇文章中我们知道retained heap代表从该类实例沿着reference chain往下所能收集到的其他类实例的shallow heap(size)总和,所以明显类实例都聚集在HashMapObject数组中了。这里我们发现一个有趣的现象,既Object数组的shallow heapretained heap竟然一样,通过Shallow and retained sizes一文可知,数组的shallow heap和一般对象(非数组)不同,依赖于数组的长度和里面的元素的类型,对数组求shallow heap,也就是求数组集合内所有对象的shallow heap之和。好,再来看org.rosenjiang.bo.Pilot对象实例的shallow heap为何是16,因为对象头是8字节,成员变量int4字节、String引用是4字节,故总共16字节。

 

在Accumulated Objects视图中,retained heap占用最多的是hashMap和object数组,为啥它们会占用这么大的heap呢?这个时候需要分析hashMap和object数组中存放了一些什么对象?接着往下看,来到了Accumulated Objects by Class区域,顾名思义,这里能找到被聚集的对象实例的类名。org.rosenjiang.bo.Pilot类上头条了,被实例化了290,325次,再返回去看程序,我承认是故意这么干的。还有很多有用的报告可用来协助分析问题,只是本文中的例子太简单,也用不上。



 

为了更多的了解MAT的功能,再举一些例子(不提供对应的代码):

例子二:

通过MAT发现heap dump问题所在,就需要寻找导致内存泄漏的代码点。这时往往需要打开对象依赖关系树形视图,点击如图按钮即可。 



 

这时会看到如下视图:



 

这个视图的右边大区域可以看到对象的依赖关系,选中某个对象以后可以在左边小窗口查看对象的一些属性。如果属性的值是一些内存地址你还可以点击工具栏的搜索按钮来搜索具体的对象信息。在进行具体分析的时候MAT只是起了帮助你进行分析的工具的功能,OOM问题分析没有固定方法和准则。只能发挥你敏锐的洞察力,结合源代码,对内存中的对象进行分析从而找到代码中的BUG. 

 

例子三:

如何查看某一个对象占用的内存空间 
1.按以下方式打开新窗口即可 ,如图:



 

2.输入类名(输入类的全名) ,如图:

 

参考资料:

http://www.blogjava.net/rosen/archive/2010/06/13/323522.html

http://seanhe.iteye.com/blog/898277

  • 大小: 37.2 KB
  • 大小: 37.2 KB
  • 大小: 20.1 KB
  • 大小: 94.6 KB
  • 大小: 109.1 KB
  • 大小: 62.6 KB
  • 大小: 14.1 KB
  • 大小: 93.3 KB
  • 大小: 96 KB
分享到:
评论

相关推荐

    Eclipse Memory Analyzer (Mac版)

    Eclipse Memory Analyzer(MAT,全称Memory Analyzer Tool)是一款强大的Java内存分析工具,尤其在Mac平台上,它提供了独立于Eclipse环境的版本,方便开发者直接使用。MAT的主要目标是帮助开发者诊断和解决Java应用...

    Eclipse Memory Analyzer中文使用说明(带书签)

    - 加载到 Memory Analyzer:在 Eclipse 中打开 MAT,导入 Heap Dump 文件进行分析。 - 分析 dominator tree 和 Leak Suspects:查看并理解 dominator tree 和 Leak Suspects 报表,找出内存占用高的对象和可疑的...

    MAT(Memory Analyzer Tool)内存分析工具的安装与使用

    MAT是分析Java堆内存的一个工具,全称是 The Eclipse ...MAT 软件版本解压后目录内有个MemoryAnalyzer.ini文件,该文件里面有个Xmx参数,该参数表示最大内存占用量,默认为1024m,根据堆转储文件大小修改该参数即可。

    Eclipse Memory Analyzer 中文文档

    这份文档共有93页,旨在帮助用户理解和利用MAT (Memory Analyzer Tool)有效地诊断和解决内存泄露问题。 MAT是IBM开发的一款强大的Java堆内存分析工具,它能对Java应用程序的heap dump文件进行深入分析,找出可能...

    java堆内存分析工具EclipseMemoryAnalyzer

    1、MemoryAnalyzer使用说明文档/使用指南 2、MemoryAnalyzer 1.8.1下载: Eclipse Memory Analyzer 是一个功能丰富且轻量的 Java 堆内存分析工具,可以用来辅助发现内存泄漏减 少内存占用。 使用 Memory Analyzer 来...

    一次使用Eclipse Memory Analyzer分析Tomcat内存溢出

    本文将详细介绍如何利用 Eclipse Memory Analyzer (MAT) 工具来诊断并解决 Tomcat 服务器上的 Java 应用程序内存溢出问题。 #### 二、内存溢出的原因及处理思路 ##### 2.1 内存泄露 - **定义**:内存泄露是指不再...

    Eclipse Memory Analyzer1.8.1&安装使用指南

    Eclipse Memory Analyzer,通常简称为MAT(Memory Analyzer Tool),是一款由Eclipse基金会开发的强大内存分析工具,主要用于诊断Java应用程序的内存泄漏和优化内存使用。它提供了深入的heap dump分析,帮助开发者...

    Eclipse--Memory-Analyzer中文教程

    Memory Analyzer可以单独使用,也可以作为Eclipse的插件使用。 内存分析的基本概念包括Heap Dump(堆转储文件),它是Java进程在运行时的一个内存快照,包含了类信息、对象信息以及线程状态信息等。Heap Dump可以...

    mat内存分析工具单独软件无需安装-Eclipse Memory Analyzer Version 1.7.0.rar

    MAT(Memory Analyzer Tool)是Eclipse项目开发的一款强大的Java内存分析工具,主要用于诊断Java应用程序的内存泄漏和性能问题。在标题中提到的“Eclipse Memory Analyzer Version 1.7.0.rar”是一个压缩包,其中...

    eclipse MAT(Memory Analyzer Tool)

    MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存...

    Memory Analyzer tool(MAT) 独立工具

    内存分析是Java应用程序性能优化的关键环节,而Memory Analyzer Tool (MAT) 是IBM开发的一款强大的内存分析工具,专门用于诊断Java应用程序中的内存泄漏和性能问题。MAT不仅提供了详细的内存使用报告,还能帮助...

    堆dump分析工具Eclipse Memory Analyzer

    Eclipse Memory Analyzer(MAT)是一款专业且功能强大的Java堆转储(heap dump)分析工具,由Eclipse基金会开发。它旨在帮助Java开发者诊断和解决内存泄漏、内存占用过高等问题,提升应用程序的性能和稳定性。MAT...

    MemoryAnalyzer-1.12.0.20210602-win32.win32.x86-64.zip

    资源名称:Eclipse MemoryAnalyzer,MAT(Memory Analyzer Tool) 文件名称:MemoryAnalyzer-1.12.0.20210602-win32.win32.x86_64.zip 描述: Eclipse Memory Analyzer是一个快速而功能丰富的Java堆分析器,可帮助您...

    MemoryAnalyzer 使用中文

    为了有效地检测和解决这些问题,Eclipse Memory Analyzer Tool(简称MemoryAnalyzer,MAT)应运而生。这款强大的分析工具提供了详细的内存分析功能,帮助开发者诊断和修复内存问题,提升应用性能。 MemoryAnalyzer...

    MemoryAnalyzer-1.10.0_x86_64.zip

    标题中的"MemoryAnalyzer-1.10.0_x86_64.zip"指的是MAT的一个特定版本,即1.10.0,针对64位架构设计。这个版本包含了对64位JVM的优化,使得它能有效地分析那些运行在64位操作系统上的Java应用的内存使用情况。 描述...

    MemoryAnalyzer(MAT)

    《深入理解MemoryAnalyzer(MAT):Android内存泄漏分析利器》 MemoryAnalyzer,简称MAT,是IBM公司开发的一款强大的Java内存分析工具,尤其在处理Android应用的内存泄漏问题时,MAT显得尤为关键。本文将深入探讨...

    MemoryAnalyzer(JDK8)-1.11.0.20201202-win32.win32.x86_64.zip

    Memory Analyzer Tool(MAT)工具是 eclipse 的一个插件(MAT 也可以单独使用),它分析大内存的 dump 文件时,可以非常直观的看到各个对象在堆空间中所占用的内存大小、类实例数量、对象引用关系、利用 OQL 对象查询,...

    MemoryAnalyzer-1.11.0.20201202-win32.win32.x86-64.zip

    资源名称:Eclipse MemoryAnalyzer,MAT(Memory Analyzer Tool) 文件名称:MemoryAnalyzer-1.11.0.20201202-win32.win32.x86_64.zip 描述: Eclipse Memory Analyzer是一个快速而功能丰富的Java堆分析器,可帮助您...

Global site tag (gtag.js) - Google Analytics