Eclipse Memory Analyzer是一个Java堆内存析工具。工具可以帮助开发者检测内存泄漏和分析内存消耗情况。Eclipse Memory Analyzer用于分析Java堆转储文件(Heap Dump)文件。本文介绍如何实用Eclipse Memory Analyzer(MAT)插件。
如何安装
Eclipse安装Eclipse Memory Analyzer插件: Heap – Install New Softwar,然后输入Juno – http://download.eclipse.org/releases/juno。安装图中选项
如何使用
模拟堆内存溢出
设置虚拟机启动参数:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\
参数说明:
- -XX:+HeapDumpOnOutOfMemoryError参数表示当JVM发生OOM时,自动生成DUMP文件。
- -XX:HeapDumpPath=${目录}参数表示生成DUMP文件的路径,也可以指定文件名称
编写程序模拟堆内存溢出,向集合中添加User对象直到内存溢出
import java.util.ArrayList;
import java.util.List;
public class HeapTest {
public static void main(String[] args) {
List<User> list = new ArrayList<User>();
while (true) {
list.add(new User());
}
}
}
public class User {
}
执行后生成Dump文件java_pid5412.hprof ,因为-XX:HeapDumpPath=D:\配置的是D盘根目录,因此从D盘根目录中找到文件
java.lang.OutOfMemoryError: Java heap space
Dumping heap to D:\java_pid5412.hprof ...
Heap dump file created [364533578 bytes in 3.270 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2760)
at java.util.Arrays.copyOf(Arrays.java:2734)
at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
at java.util.ArrayList.add(ArrayList.java:351)
分析堆内存溢出
使用File- Open File打开java_pid5412.hprof
- Histogram 可以列出内存中的对象,对象的个数以及大小;
- Dominator Tree 可以列出那个线程,以及线程下面的那些对象占用的空间;
- Top consumers 通过图形列出最大的object;
- Leak Suspects 通过MA自动分析泄漏的原因。
Histogram
、可以列出内存中的对象,对象的个数以及大小;我们选择第2个选项查看矩形图查看对象对象信息,从图中可以看出 User对象很多
Dominator Tree
可以列出那个线程,以及线程下面的那些对象占用的空间;
Leak Suspects
通过MA自动分析泄漏的原因