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 : 查看这个对象被哪些外部对象引用。

堆栈信息中提示这里

指出是这里导致使用内存过多,找到问题原因

点击详情,可以看到

posted @ 2022-07-29 23:11  星光闪闪  阅读(589)  评论(0)    收藏  举报