【深入理解jvm虚拟机】内存溢出分析工具MAT
演示内存溢出
public class OutOfMemoryTest {
/**
* 定义一个静态内部类
*/
static class Test{ }
/**
* 无限创建对象 模拟内存溢出
*
* 启动参数设置: 限制最大可用内存,并生成内存溢出快照
* -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=F:\MemoryAnalyze\dump -Xms5m -Xmx5m
*
* @param args
*/
public static void main(String[] args) {
List<Test> list=new ArrayList<>();
while (true){
list.add(new Test());
}
}
}
运行结果 显示堆内存溢出,并且成了快照文件
下载MAT工具
http://www.eclipse.org/mat/downloads.php
分析快照文件
启动MAT
工具 选择File
-> Open Heap Dump
-
Histogram
:查看内存中的对象,对象的个数以及大小。 -
Dominator Tree
:列出那个线程,以及线程下面的那些对象占用的空间。 - Top consumers:通过图形列出最大的object。
- Leak Suspects:通过MA自动分析泄漏的原因。
Histogram
-
Class Name
: 类名称,java类名 -
Objects
: 类的对象的数量,这个对象被创建了多少个 -
Shallow Heap
:一个对象内存的消耗大小,不包含对其他对象的引用 -
Retained Heap
:是shallow Heap的总和,也就是该对象被GC之后所能回收到内存的总和 -
Problem Suspect 1
: 区域就是可能发生问题的区域
查看如下视图 分析详细情况
-
Shallow Heap
:选中行对象占堆内存大小, -
Retained Heap
:选中行对象引用的所有对象占堆内存大小 -
Percentage
:选中行对象占用内存的百分比
查看占用最高的对象 如下图所示 发生是OutOfMemoryTest这个类创建的过多,找到源码中这个类,优化代码即可解决
参考链接