Java程序内存分析:使用mat工具分析内存占用(1)
Java程序内存分析:使用mat工具分析内存占用(1)
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),检查代码是否存在对象生命周期太长、持有状态时间过长的情况。
1. 用jmap生成堆信息
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正则搜索一下我们自己的类,排序后看看哪些相对是占用比较大的。
左边可以看到类的详细使用,比如所属包,父类是谁,所属的类加载器,内存地址,占用大小和回收情况等
用户点评