eclipse-mat(Memory Analyzer)插件
安装了mat文件,eclipse就可以打开hprof文件了
实例
|
public class XgssTest {
public static void main(String[] args){ List<TestObject> list=new ArrayList<TestObject>(); while(true){ list.add(new TestObject()); } } static class TestObject{} } |

设置虚拟机参数

参数说明:
xms初始分配堆内存大小
xmx最大分配堆内存大小
然后运行

报堆内存溢出:需要使用的内存超过了虚拟机提供的内存
java.lang.OutOfMemoryError: Java heap space
代表堆内存满了,新对象没地方了
从上面的日志输出可以看到堆转储快照文件为java_pid34164.hprof
个文件 在你的项目的根目录下
然后打开这个文件




Histogram 可以列出内存中的对象,对象的个数以及大小;
Dominator Tree 可以列出那个线程,以及线程下面的那些对象占用的空间;
Top consumers 通过图形列出最大的object;
Duplicate Classes: 查找出在不同classloader中加载的相同类。
Leak Suspects 通过MA自动分析泄漏的原因。
点击Histogram

Shallow Size
对象自身占用的内存大小,不包括它引用的对象。
针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。
针对数组类型的对象,它的大小是数组元素对象的大小总和。
Retained Size
Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C, C就是间接引用)
换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。
不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。

list objects -- with outgoing references : 查看这个对象持有的外部对象引用。
list objects -- with incoming references : 查看这个对象被哪些外部对象引用。


堆栈信息中提示这里

指出是这里导致使用内存过多,找到问题原因
点击详情,可以看到


浙公网安备 33010602011771号