`

使用 Eclipse Memory Analyzer 进行堆转储文件分析

MAT 
阅读更多

简介: Eclipse Memory Analyzer(MAT)是著名的跨平台集成开发环境 Eclipse Galileo 版本的 33 个组成项目中之一,它是一个功能丰富的 JAVA 堆转储文件分析工具,可以帮助你发现内存漏洞和减少内存消耗。本文主要介绍如何安装配置 Memory Analyzer,并结合一个实例,介绍如何利用 MAT 来进行堆转储文件分析,找到内存泄露的根源。

概述

对于大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环 境中进行重现。JVM 能够记录下问题发生时系统的部分运行状态,并将其存储在堆转储 (Heap Dump) 文件中,从而为我们分析和诊断问题提供了重要的依据。

通常内存泄露分析被认为是一件很有难度的工作,一般由团队中的资深人士进行。不过,今天我们要介绍的 MAT(Eclipse Memory Analyzer)被认为是一个“傻瓜式“的堆转储文件分析工具,你只需要轻轻点击一下鼠标就可以生成一个专业的分析报告。和其他内存泄露分析工具相 比,MAT 的使用非常容易,基本可以实现一键到位,即使是新手也能够很快上手使用。

MAT 的使用是如此容易,你是不是也很有兴趣来亲自感受下呢,那么第一步我们先来安装 MAT。

生成分析报告

首先,启动前面安装配置好的 Memory Analyzer tool , 然后选择菜单项 File- Open Heap Dump 来加载需要分析的堆转储文件。文件加载完成后,你可以看到如图 4 所示的界面:


图 4. 概览
图 4. 概览

通过上面的概览,我们对内存占用情况有了一个总体的了解。先检查一下 MAT 生成的一系列文件。


图 5. 文件列表
图 5. 文件列表

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

接下来我们就可以来看看生成的报告都包括什么内容,能不能帮我们找到问题所在吧。您可以点击工具栏上的 Leak Suspects 菜单项来生成内存泄露分析报告,也可以直接点击饼图下方的 Reports->Leak Suspects 链接来生成报告。


图 6. 工具栏菜单
图 6. 工具栏菜单

分析三步曲

通常我们都会采用下面的“三步曲”来分析内存泄露问题:

首先,对问题发生时刻的系统内存状态获取一个整体印象。

第二步,找到最有可能导致内存泄露的元凶,通常也就是消耗内存最多的对象

接下来,进一步去查看这个内存消耗大户的具体情况,看看是否有什么异常的行为。

下面将用一个基本的例子来展示如何采用“三步曲”来查看生产的分析报告。

查看报告之一:内存消耗的整体状况


图 7. 内存泄露分析报告
图 7. 内存泄露分析报告

如图 7 所示,在报告上最醒目的就是一张简洁明了的饼图,从图上我们可以清晰地看到一个可疑对象消耗了系统 99% 的内存。

在图的下方还有对这个可疑对象的进一步描述。我们可以看到内存是由 java.util.Vector 的实例消耗的,com.ibm.oti.vm.BootstrapClassLoader 负责这个对象的加载。这段描述非常短,但我相信您已经可以从中找到很多线索了,比如是哪个类占用了绝大多数的内存,它属于哪个组件等等。

接下来,我们应该进一步去分析问题,为什么一个 Vector 会占据了系统 99% 的内存,谁阻止了垃圾回收机制对它的回收。

查看报告之二:分析问题的所在

首先我们简单回顾下 JAVA 的内存回收机制,内存空间中垃圾回收的工作由垃圾回收器 (Garbage Collector,GC) 完成的,它的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃 圾对象,可以回收其占据的空间,用于再分配。

在垃圾回收机制中有一组元素被称为根元素集合,它们是一组被虚拟机直接引用的对象,比如,正在运行的线程对象,系统调用栈里面的对象以及被 system class loader 所加载的那些对象。堆空间中的每个对象都是由一个根元素为起点被层层调用的。因此,一个对象还被某一个存活的根元素所引用,就会被认为是存活对象,不能被 回收,进行内存释放。因此,我们可以通过分析一个对象到根元素的引用路径来分析为什么该对象不能被顺利回收。如果说一个对象已经不被任何程序逻辑所需要但 是还存在被根元素引用的情况,我们可以说这里存在内存泄露。

现在,让我们开始真正的寻找内存泄露之旅,点击“Details ”链接,可以看到如图 8 所示对可疑对象 1 的详细分析报告。


图 8. 可疑对象 1 的详细分析报告
图 8. 可疑对象 1 的详细分析报告

  1. 我们查看下从 GC 根元素到内存消耗聚集点的最短路径:


图 9. 从根元素到内存消耗聚集点的最短路径
图 9. 从根元素到内存消耗聚集点的最短路径

我们可以很清楚的看到整个引用链,内存聚集点是一个拥有大量对象的集合,如果你对代码比较熟悉的话,相信这些信息应该能给你提供一些找到内存泄露的思路了。

接下来,我们再继续看看,这个对象集合里到底存放了什么,为什么会消耗掉如此多的内存。


图 10. 内存消耗聚集对象信息
图 10. 内存消耗聚集对象信息

在这张图上,我们可以清楚的看到,这个对象集合中保存了大量 Person 对象的引用,就是它导致的内存泄露。

至此,我们已经拥有了足够的信息去寻找泄露点,回到代码,我们发现,是下面的代码导致了内存泄露 :


清单 1. 内存泄漏的代码段

				
 while (1<2) 
 { 
			
	 Person person = new Person("name","address",i); 
	 v.add(person); 
	 person = null; 
 } 

总结

从上面的例子我们可以看到用 MAT 来进行堆转储文件分析,寻找内存泄露非常简单,尤其是对于新手而言,这是一个很好的辅助分析工具。但是,MAT 绝对不仅仅是一个“傻瓜式”内存分析工具,它还提供很多高级功能,比如 MAT 支持用 OQL(Object Query Language)对 heap dump 中的对象进行查询,支持对线程的分析等,有关这些功能的使用可以参考 MAT 的帮助文档

分享到:
评论

相关推荐

    使用 Eclipse Memory Analyzer 进行堆转储文件分析_files

    本教程将重点讲解如何使用Eclipse Memory Analyzer对JMAP生成的堆转储文件进行分析。 首先,我们需要理解堆转储文件的用途。当Java应用出现内存问题时,通过JMAP命令可以生成堆转储文件,该文件包含了应用程序的...

    java堆内存分析工具EclipseMemoryAnalyzer

    使用 Memory Analyzer 来分析生产环境的 Java 堆转储文件,可以从数以百万计的对象中快速计算出对 象的 Retained Size,查看是谁在阻止垃圾回收,并自动生成一个 Leak Suspect(内存泄露可疑点) 报表。 Memory ...

    堆dump分析工具Eclipse Memory Analyzer

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

    Eclipse--Memory-Analyzer中文教程

    Eclipse Memory Analyzer(内存分析器)是一款专门为Java堆内存分析而设计的工具,它可以协助开发者快速地分析内存泄漏问题,通过生成的报告指出潜在的内存泄漏可疑点。Memory Analyzer可以单独使用,也可以作为...

    EclipseMemoryAnalyzer-x86_64

    标题“EclipseMemoryAnalyzer-x86_64”表明这是一款针对x86_64(64位)架构的Eclipse Memory Analyzer工具。这通常意味着该版本可以运行在64位的操作系统上,例如Windows、Linux或macOS。同时,“MemoryAnalyzer-1.7...

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

    1. **堆转储分析**:当Java应用出现内存溢出等问题时,可以生成堆转储文件。MAT能加载这个文件,分析内存中对象的分配和引用情况。 2. **对象计数**:MAT可以计算特定类实例的数量,帮助识别可能存在内存泄漏的对象...

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

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

    Eclipse Memory Analyzer内存映像分析工具

    MAT通过解析.hprof文件,即Java虚拟机生成的内存快照,来展示堆内存的详细信息,从而进行深入的内存分析。 在使用MAT之前,首先需要获取到.hprof文件。这通常通过在运行中的Java应用中触发堆转储来实现,例如通过...

    MemoryAnalyzer-1.7.0.201706130745.zip

    使用MemoryAnalyzer进行内存分析时,主要涉及以下关键知识点: - **内存泄漏检测**:MAT可以通过分析堆转储文件(Heap Dump)来识别哪些对象被过度保留,从而找出可能存在的内存泄漏问题。它能提供详细的报告,包括...

    MemoryAnalyzer内存分析工具单独软件无需安装18.1

    MAT 软件版本解压后目录内有个MemoryAnalyzer.ini文件,该文件里面有个Xmx参数,该参数表示最大内存占用量,默认为1024m,根据堆转储文件大小修改该参数即可。 1. MemoryAnalyzer.ini中的参数一般默认为-vmargs– ...

    MemoryAnalyzer 使用中文.pdf

    根据提供的文件内容,可以详细解读Eclipse Memory Analyzer Tool(MAT)的相关知识点。MAT是一个专门用于Java堆内存分析的工具,它可以辅助开发者发现内存泄漏的问题。以下是详细的知识点解析: 1. 堆转储(Heap...

    EclipseMemoryAnalyzer.doc

    Eclipse Memory Analyzer (MAT) 是一款功能强大且轻量级的Java堆内存分析工具,它能够帮助开发者有效地识别和定位内存泄漏问题,减少应用的内存占用。通过分析生产环境下的Java堆转储文件,MAT能够快速计算出数百万...

    MemoryAnalyzer-1.10.0.20200225-linux.gtk.x86_64可适配jdk1.8

    在实际操作中,用户通常会使用MAT的`mat_10`这样的文件来导入堆转储文件进行分析。这个文件可能是一个经过压缩的内存快照,包含了程序运行时的内存状态。解压后,MAT工具能够读取并解析其中的数据,展示出详细的内存...

    MemoryAnalyzer JVM堆内存分析工具

    《深入解析MemoryAnalyzer:JVM堆内存分析利器》 在Java开发中,内存管理是至关重要的环节,良好的内存管理能够优化应用性能,防止内存泄漏,提升系统稳定性。MemoryAnalyzer(MAT)是一款强大的JVM堆内存分析工具...

    MemoryAnalyzer-1.9.2.20200115-linux.gtk.x86_64.zip

    1. **堆转储分析**:当Java应用遇到内存问题时,可以生成堆转储文件。MAT能够读取这些文件,并提供深入的内存使用情况分析。 2. **对象分配追踪**:MAT可以帮助用户追踪对象的分配路径,找出哪些类或方法是内存消耗...

    MAT Eclipse MemoryAnalyzer java性能分析

    在这个"MAT Eclipse MemoryAnalyzer java性能分析"主题中,我们将深入探讨MAT的核心功能、使用方法以及如何通过它来提升Java应用的性能。 MAT提供了丰富的视图和功能,帮助开发者识别内存问题。其中,最重要的可能...

    Eclipse Memory Analyzer

    - **堆转储分析**:MAT可以从运行中的Java应用程序获取堆转储(Heap Dump),然后进行深入分析,找出内存占用量大的对象和可能的内存泄漏。 - **对象分配轨迹**:通过追踪对象的分配路径,帮助开发者了解对象是...

    MemoryAnalyzer-1.8.1.20180910-win32.win32.x86_64.zip

    Memory Analyzer (Eclipse MAT)是一个跨平台的开源工具,您不仅可以用它来复...通过读取应用程序运行时由百 Java 运行时环境生成的转储文件快照,Memory Analyzer 使您能够分析那些调试代码可能无法发现的复杂问题。

Global site tag (gtag.js) - Google Analytics