MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件。但是比较主流的厂家和格式,例如 Sun, HP, SAP 所采用的 HPROF 二进制堆存储文件,以及 IBM 的 PHD 堆存储文件等都能被很好的解析。下面来看看要怎么做呢,也许对你有用。官方文档:http://help.eclipse.org/luna/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html
造成OutOfMemoryError原因一般有2种:
1、内存泄露,对象已经死了,无法通过垃圾收集器进行自动回收,通过找出泄露的代码位置和原因,才好确定解决方案;是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。 (给了收不回)
2、内存溢出,内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生命周期太长、持有状态时间过长的情况。指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。(给了不够用)(强引用)
可以在oom的时候自动导出堆信息,也可用jmap导出(正常时)
action是统计 report是分析
命令是动态分析(分析大部分问题),mat是静态分析(分析内存问题)
内存分析需要用相应的统计统计,靠看是看不出,线程可以看出(也有分析工具)--找到自定义类占比大的
用命令看动态的内存分配,cpu占用,用dump分析详细的oom问题点,栈日志分析线程阻塞的情况
最后都落在类上
1,直接类对像的维度,分析占用空间---核心落在类上
2,线程维度,分析里面对下个的占用
3,按照包名查看
4,按照使用次数
1. 用jmap生成堆信息
这样在E盘的jmap文件夹里会有一个map.bin的堆信息文件
2. 将堆信息导入到mat中分析
3. 生成分析报告
mat可以为我们生成多个报告:
下面来看看生成的这些数据对我们有什么帮助
从上图可以看到它的大部分功能,在饼图上,你会发现转储的大小和数量的类,对象和类加载器。
正确的下面,饼图给出了一个印象最大的对象转储。移动你的鼠标一片看到对象中的对象的细节检查在左边。下面的Action标签中:
-
Histogram可以列出内存中的对象,对象的个数以及大小。
-
Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。
-
Top consumers通过图形列出最大的object。
-
Leak Suspects通过MA自动分析泄漏的原因。
Histogram
-
Class Name : 类名称,java类名
-
Objects : 类的对象的数量,这个对象被创建了多少个
-
Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用
-
Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收到内存的总和
一般来说,Shallow Heap堆中的对象是它的大小和保留内存大小相同的对象是堆内存的数量时,将释放对象被垃圾收集。
保留设置一组主要的对象,例如一个特定类的所有对象,或所有对象的一个特定的类装入器装入的类或者只是一群任意对象,是释放的组对象如果所有对象的主要设置变得难以接近的。保留设置包括这些对象以及所有其他对象只能通过这些对象。保留大小是总堆大小中包含的所有对象的保留。摘自eclipse
关于的详细讲解,建议大家查看Shallow heap & Retained heap,这是个很重要的概念。
这儿借助工具提供的regex正则搜索一下我们自己的类,排序后看看哪些相对是占用比较大的。
左边可以看到类的详细使用,比如所属包,父类是谁,所属的类加载器,内存地址,占用大小和回收情况等
这儿有个工具可以根据自己的需求分组查找,默认根据class分组,类似我们sql里的group by了~~
这里可以看到上面3个选项,分别生成overview、leak suspects、top components数据,但是这儿生成的不是图表,如果要看图表在(Overview)中的Action标签里点击查看。
这个是Overview中的 Heap Dump Overview视图,从工具栏中点开,这是一个全局的内存占用信息
Used heap dump | 79.7 MB |
Number of objects | 1,535,626 |
Number of classes | 8,459 |
Number of class loaders | 74 |
Number of GC roots | 2,722 |
Format | hprof |
JVM version |
|
Time | 格林尼治标准时间+0800上午9时20分37秒 |
Date | 2014-7-2 |
Identifier size | 32-bit |
File path | E:\jmap\map.bin |
File length | 108,102,005 |
|
|
然后可以点开SystemProperties和Thread Overview进行查看,我这里就不贴了内容比较多。
Dominator Tree
我们可以看到ibatis占了较多内存
Top consumers
这张图展示的是占用内存比较多的对象的分布,下面是具体的一些类和占用。
按等级分布的类使用情况,其实也就是按使用次数查看,java.lang.Class被排在第一
还有一张图是我们比较关心的,那就是按包名看占用,根据包我们知道哪些公共用的到jar或自己的包占用
这样就可以看到包和包中哪些类的占用比较高。
Leak Suspects
从这份报告,看到该图深色区域被怀疑有内存泄漏,可以发现整个heap只有79.7M内存,深色区域就占了62%。所以,MAT通过简单的报告就说明了项目是有可疑代码的,具体点开详情来找到类,
点击鼠标,在List Objects-> with outgoing references下可以查看该类都引用了什么对象,由此查看是否因为其他对象导致的内存问题。
下面继续查看pool的gc ROOT
如下图所示的上下文菜单中选择 Path To GC Roots -> exclude weak references, 过滤掉弱引用,因为在这里弱引用不是引起问题的关键。
进入查看即可,我这儿的代码没有问题,就不用贴了。
The classloader/component "org.apache.catalina.loader.WebappClassLoader @ 0xa34cde8" occupies 19,052,864 (22.80%) bytes. The memory is accumulated in one instance of "java.util.HashMap$Entry[]" loaded by "<system class loader>".
Keywords
java.util.HashMap$Entry[]
org.apache.catalina.loader.WebappClassLoader @ 0xa34cde8
这段话是在工具中提示的,他告诉我们WebappClassLoader占了19,052,864 字节的容量,这是tomcat的类加载器,JDK自带的系统类加载器中占用比较多的是HashMap。这个其实比较正常,大家经常用map作为存储容器。
除了在上一页看到的描述外,还有Shortest Paths To the Accumulation Point和Accumulated Objects部分,这里说明了从GC root到聚集点的最短路径,以及完整的reference chain。观察Accumulated Objects部分,java.util.HashMap的retained heap(size)最大,所以明显类实例都聚集在HashMap中了。
来看看Accumulated Objects by Class区域,这里能找到被聚集的对象实例的类名。java.util.HashMap类上头条了,被实例化了5573次,从这儿看出这个程序不存在什么问题,因为这个数字是比较正常的,但是当出问题的时候我们都会看到比较大的自定义类会在前面,而且占用是相当高。
当然,mat这个工具还有很多的用法,这里把我了解的分享给大家,不管如何,最终我们需要得出系统的内存占用,然后对其进行代码或架构,服务器的优化措施!
参考文献:
http://www.eclipse.org/mat/about/screenshots.php
http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/
相关推荐
MAT(Memory Analyzer Tool)是一款由Eclipse基金会开发的专业Java堆内存分析工具,它同样适用于Android应用的内存管理。MAT可以帮助开发者识别内存泄漏、查找对象生命周期问题以及优化内存使用效率。 标题中的...
MAT工具通过解析Java heap dump文件,能够展示详细的内存占用情况,包括对象实例、类、包和库的内存分布,以及引用链路,帮助开发者定位内存泄漏的源头。 MAT主要功能及知识点包括: 1. **对象视图**:展示堆中...
MAT工具不仅适用于Android应用,也适用于任何基于Java的系统。 **一、MAT的下载与安装** 由于MAT不是Android Studio的标准组件,开发者需要单独下载。通常,MAT会作为一个独立的Eclipse插件形式存在。在下载过程中...
7. **DOMinator Tree**:针对XML解析相关的内存问题,MAT提供了DOMinator Tree视图,展示XML DOM节点的内存占用情况。 8. **饼图与柱状图**:MAT提供了可视化图表,以直观的方式展示内存分布情况。 9. **Shallow ...
总结起来,MAT作为一款强大的Java内存分析工具,具备了深度分析、自动化检测内存泄漏、直观的内存结构展示等功能,是Java开发者必备的调试利器。无论是排查生产环境的内存问题,还是在开发阶段优化代码,MAT都能提供...
MAT是分析Java堆内存的一个工具,全称是 The Eclipse ...MAT 软件版本解压后目录内有个MemoryAnalyzer.ini文件,该文件里面有个Xmx参数,该参数表示最大内存占用量,默认为1024m,根据堆转储文件大小修改该参数即可。
MAT(Memory Analyzer Tool)是Eclipse基金会开发的一款强大的Java内存分析工具,特别适用于诊断和优化Java应用程序的内存管理问题。它可以帮助开发者定位内存泄漏、分析堆转储文件,从而提高应用的性能和稳定性。在...
3. **大型对象分析**:MAT可以帮助用户找出占用内存较大的对象,这些大对象可能没有被及时释放,导致内存占用过高。大型对象分析有助于优化内存分配策略,减少内存碎片。 4. **DOM树分析**:对于使用了DOM模型的...
5. **String析构分析**:MAT可以分析字符串池,找出重复或未使用的字符串,有助于减少内存占用。 6. **OQL查询语言**:MAT支持OQL(Object Query Language),允许用户自定义查询,深入探索堆内存的细节。 7. **...
MAT是Eclipse项目的一部分,它是一款免费且开源的工具,专门用于分析Java堆转储(Heap Dump)文件,帮助开发者识别内存泄漏、分析内存占用情况以及优化内存使用。MAT提供了丰富的功能和视图,使得复杂的内存问题变得...
使用MAT的其他功能,如"Shallow Heap"和"Retained Heap",了解对象自身的内存占用和通过其保留的总内存大小。还可以使用"Comparison"功能对比不同时间点的堆内存快照,找出内存增长的原因。 8. **优化和修复** ...
4. **饼图和条形图**:这些图表以图形化的方式显示内存占用情况,便于快速识别大对象和类。 5. **报告生成**:MAT可以生成详细的内存分析报告,方便分享和进一步研究。 6. **Shallow Heap与Retained Heap**:MAT...
标题中提到的"mat工具,可以分析hprof文件",这正是MAT的核心功能之一。HProf是Java虚拟机(JVM)生成的一种标准的内存剖析数据格式,它记录了JVM运行时的内存信息,包括对象分配、存活状态、引用关系等。 MAT通过...
MAT,全称Memory Analyzer Tool,是由Eclipse基金会开发的一款强大的Java内存分析工具。它主要用于诊断Java应用程序的内存泄漏问题,帮助开发者找出程序中占用内存过高的对象和引用链,从而优化应用性能。MAT分析...
在实际使用中,开发者应结合日志、代码审查和其他性能指标,综合分析MAT提供的信息,找出并修复内存问题。此外,定期进行内存分析和优化,是保持应用程序高效运行的关键步骤。记住,MAT虽然强大,但理解Java内存模型...
### 内存分析工具MAT使用详解 #### 一、MAT简介 MAT(Memory Analyzer Tool)是一款功能强大且易于使用的内存分析工具,它基于Eclipse平台,主要用于帮助开发人员定位和解决Java应用程序中的内存泄漏问题。MAT能够...
7. **惠普尔分析**:MAT提供了一种快速的方法来定位大量占用内存的类,有助于找出内存占用大户。 在实际使用MAT时,我们需要先获取heap dump文件,这通常可以通过JVM的`jmap`命令或在JVM崩溃时自动生成。然后导入到...
MAT(Memory Analyzer Tool)是IBM提供的一款强大的Java内存分析工具,它专为解决此类问题而设计,帮助开发者深入理解内存消耗,有效地定位内存泄漏和性能瓶颈。 MAT的使用方法和功能详解: 1. **数据获取**:首先...
2. **对象分配和生存周期分析**:" Histogram "功能展示了所有类的实例数量和内存占用,以及对象的生命周期信息。这有助于了解哪些对象被频繁创建但未被及时释放。 3. **引用路径分析**:" Dominator Tree "显示了...