1.首先我们通过下面的一个示例代码产生一个OutOfMemoryError时对应的dump文件
/**
*
*/
package simple.test;
import java.util.ArrayList;
import java.util.List;
/**
* @author: 作者: chengaofeng
* @date: 创建时间:2018-09-11 16:50:59
* @Description: TODO
* @version V1.0
*/
public class MatSimple {
public static void main(String[] args) {
PersonRepo pp = new PersonRepo();
pp.autoCreatePerson(10000000);
}
public static class PersonRepo {
private List<Person> repo = new ArrayList<>();
public void autoCreatePerson(long count) {
for (long l = 0; l < count; l++) {
repo.add(new Person(l));
}
}
}
public static class Person {
private long num;
/**
* @param num
*/
public Person(long num) {
this.num = num;
}
public long getNum() {
return this.num;
}
}
}
我们通过在eclipse中配置运行参数的形式获取对应的dump
执行run,很快在控制台中会出现异常以及生成dump文件的信息
2.利用MAT打开dump文件 File > Open Heap Dump...
默认情况会让选择一个报告模式,可以跳过,也可以选择任意一个选择finish,之后进入Overview界面
2.1 Overview
在右侧的窗口的details分类下可找到dump的大小,类、对象、以及类加载器的个数。
接下来的饼图中列出了dump中的大对象,一般情况下当某一类对象占用的特别多时就是程序有内存泄漏的可能了。当鼠标滑过一个饼图中的一个分类时在右侧会显示详细信息,点击在弹出菜单中可进一步对这一类对象进行分析。
2.2 Histogram
通过工具栏中的Histogram按钮或者在Overview界面的action中选择Histogram可以打开Histogram界面。
通过Histogram可以看到每类对象的个数以及
shallow size 和 retained size .
在这个页面,我们已经很明确看出来,现在dump中主要是存储了大量的simple.test.MatSimple$Person对象(1,215,488个,占用了快30M的内存)对于我们的测试应用来说已经能发现是对Person对象的处理有问题造成了内存泄漏。
在这个页面我们可以对任何有疑问的对象做进一步分析
或者对对象分组排序等操作
例如按package排序后很容易就能看出是哪个package中的类占用的内存比较多
2.3 Dominator Tree
通过工具栏中的
Dominator Tree按钮或者在Overview界面的action中选择Dominator Tree可以打开Dominator Tree界面。
Dominator Tree列出了dump中所有占用内存大的对象。Dominator Tree在分析dump中哪个对象保持其他对象存活方面非常强大。并且也可以用package、class loader来排序
通过这个图,我们可以看到,在我们的例子中,主线程中保留了一个Person对象数组(list的底层实现是一个数组),里面保存了1,215,462个person对象,因为main tread无法被GC,造成大量的person对象无法被GC,即问题是出在主线程的一个存储Person对象的数组(list)中的。继而我们就可以发现代码问题了。
2.4 Path to GC Roots
GC Roots指的是那些被jvm保持存活状态的对象,通过分析一个对象到GC Roots的路径,可以更加清楚的看到是因为什么原因造成此对象在内存中一直存活的,即一个对象为什么没有被GC回收,在Dominator Tree界面选中人意我们想分析的对象,点击
可以看到我们的person对象是作为一个Object存储在了main Thread中的一个ArrayList中的。
2.5 The Leak Report
通过这个MAT会自动给我们一个最有可能引起内存问题的报告
MAT给出的推断是main Thread中保持了一个Object[]变量,占用了大量的空间,点击details
在Dominator Tree堆积列表中,可以看出实际是存储了大量的Person对象。
2.6 Top Consumer
在Overview界面的actions中选择Top Consumer操作,可以列出dump中占用空间最大的对象,并用类和package分组,当我们分析的dump文件特别大时可以用这个操作先对大对象分析
- 大小: 77.4 KB
- 大小: 70.6 KB
- 大小: 119.6 KB
- 大小: 221.7 KB
- 大小: 166.2 KB
- 大小: 105 KB
- 大小: 153.5 KB
- 大小: 68 KB
- 大小: 75 KB
- 大小: 88.1 KB
- 大小: 263.2 KB
- 大小: 171.7 KB
- 大小: 73.7 KB
- 大小: 99 KB
- 大小: 93.1 KB
- 大小: 120.6 KB
分享到:
相关推荐
MAT(Memory Analyzer Tool)是Eclipse项目开发的一款强大的Java内存分析工具,主要用于诊断Java应用程序的内存泄漏和性能问题。在标题中提到的“Eclipse Memory Analyzer Version 1.7.0.rar”是一个压缩包,其中...
MAT是Eclipse项目的一部分,它是一款免费且开源的工具,专门用于分析Java堆转储(Heap Dump)文件,帮助开发者识别内存泄漏、分析内存占用情况以及优化内存使用。MAT提供了丰富的功能和视图,使得复杂的内存问题变得...
MAT,全称Memory Analyzer Tool,是由IBM开发的一款强大的Java堆内存分析工具,尤其适用于解决Java应用程序中的内存泄漏和性能优化问题。在Windows 64位操作系统环境下,MAT提供了深入洞察内存消耗情况的能力,帮助...
MAT(Memory Analyzer Tool)是由Eclipse基金会开发的一款强大的Java堆内存分析工具,虽然在Android Studio中内置了内存分析功能,但若需要更深入的内存泄漏检测和性能优化,MAT提供了更为专业的解决方案。MAT工具...
MAT,全称Memory Analyzer Tool,是由IBM开发的一款强大的Java内存分析工具。...对于Linux 64位环境下的开发者来说,独立版本的MAT提供了更灵活的使用方式,使得即使不使用Eclipse也能进行高效的内存分析。
### Eclipse MAT:Java内存分析的必备中文指南 #### 一、引言 Eclipse Memory Analyzer Tool(MAT)是一款专门用于Java应用程序内存分析的强大工具。它不仅适用于初学者,也深受经验丰富的开发者的喜爱。MAT可以...
MAT(Memory Analyzer Tool)是一款强大的64位内存分析工具,由Eclipse基金会开发,专为Java开发者和运维人员设计,用于检测和诊断内存泄漏问题。 MAT提供了一个直观的用户界面,支持对.hprof文件进行深度分析,...
MAT通过分析堆转储文件,可以找出那些长时间持有大量内存但不再使用的对象,帮助定位可能存在的内存泄漏问题。 2. **对象分配轨迹**: MAT提供了一种追踪对象分配路径的能力,这有助于理解对象是如何被创建、如何...
EclipseMAT 是一个功能强大且易于使用的内存分析工具,它的优点包括: * 可以快速地分析大规模的堆 heap 信息。 * 可以自动检测内存泄漏的来源。 * 提供了详细的分析报告,包括对象的数量、大小、引用关系等信息。 ...
Eclipse Memory Analyzer 是一个功能丰富且轻量的 Java 堆内存分析工具,可以用来辅助发现内存泄漏减 少内存占用。 使用 Memory Analyzer 来分析生产环境的 Java 堆转储文件,可以从数以百万计的对象中快速计算出对 ...
手册中还可能包括了如何使用DS-5中的各种工具,例如编译器、调试器和性能分析器等。考虑到ARM处理器的应用场景,手册中也可能包含了针对特定硬件平台的开发、调试技巧,以及如何有效地诊断和解决开发过程中遇到的...
9. **D3.js集成**:MAT使用D3.js库来生成交互式的可视化图表,使分析过程更加直观。 10. **比较内存快照**:可以对比两个不同的内存快照,找出内存状态的变化,这对于追踪内存泄漏问题尤为有用。 在实际使用过程中...
通过学习这份中文文档,开发者不仅可以掌握MAT的基本操作,还能了解到如何有效地解读分析结果,以及如何根据这些信息调整代码,避免或修复内存泄露问题。对于Java应用的性能优化和稳定运行来说,熟练使用MAT是一项必...
IBM MAT(Memory Analyzer Tool)是IBM提供的一款强大的Java内存分析工具,主要用于诊断和解决Java应用程序中的内存泄漏问题。MAT分析工具结合了先进的分析算法和直观的用户界面,使得开发者能够深入理解内存消耗...
MemoryAnalyzer,即MAT(Memory Analyzer Tool),是一款由Eclipse基金会开发的强大的Java内存分析工具,尤其适用于IBM JVM(openj9)上的heap dump文件分析。本文将详细介绍MemoryAnalyzer的特性和功能,以及如何...
- 在分析大内存堆时,MAT可能会消耗大量系统资源,确保有足够的内存供MAT使用。 - 分析结果可能需要专业知识解读,理解Java内存模型和垃圾收集机制是必不可少的。 - 不要仅仅依赖MAT,结合代码审查和性能测试,才能...
它是一个基于Eclipse平台的工具,用于帮助开发人员分析和优化应用程序的内存使用情况。该工具可以帮助识别内存泄漏问题,并提供有关内存分配、对象引用和垃圾回收等方面的详细信息。该资源适用于Linux操作系统,并且...
Eclipse Memory Analyzer(MAT)是一款强大的Java内存分析工具,它被广泛用于诊断和解决Java应用程序中的内存泄漏问题。MAT 1.8.1是适用于macOS的特定版本,旨在帮助开发者深入理解并优化他们的Java应用内存使用情况...
MAT的使用不仅限于内存泄漏分析,还可以用于优化内存配置,理解应用程序的内存使用模式,以及在复杂环境下的问题定位。配合Eclipse IDE(eclipsec.exe)中的插件,MAT能更好地融入开发流程,提高问题排查效率。 在...
这份"使用说明手册"将引领初学者逐步掌握Eclipse的各项功能,并深入理解其高级特性,如远程协助和代码重构。 一、Eclipse基础操作 1. **安装与启动**:Eclipse提供适用于Windows、Mac OS X和Linux的版本。下载完成...