JVM如何用Eclipse Memory Analyzer分析堆内存溢出

  • Post author:
  • Post category:其他


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

  1. Histogram  可以列出内存中的对象,对象的个数以及大小;
  2. Dominator Tree  可以列出那个线程,以及线程下面的那些对象占用的空间;
  3. Top consumers  通过图形列出最大的object;
  4. Leak Suspects  通过MA自动分析泄漏的原因。

Histogram

、可以列出内存中的对象,对象的个数以及大小;我们选择第2个选项查看矩形图查看对象对象信息,从图中可以看出 User对象很多

Dominator Tree

可以列出那个线程,以及线程下面的那些对象占用的空间;

Leak Suspects

通过MA自动分析泄漏的原因


上一篇:JVM记一次堆内存溢出OutOfMemoryError: Java heap space