jvm内存溢出之Memory Analizer分析内存快照

mat是eclipse的一个插件,可以分析内存快照帮助我们排查内存泄漏的地方。

首先下载mat, MemoryAnalyzer-1.8.1.20180910-win32.win32.x86_64.zip

解压后:

jvm内存溢出之Memory Analizer分析内存快照_第1张图片

双击 MemoryAnalyzer.exe 打开mat

jvm内存溢出之Memory Analizer分析内存快照_第2张图片

写一段出现内存溢出的代码,设置jvm参数 使其出现内存溢出生成一个内存快照文件

package cn.n1.t1;

import java.util.ArrayList;
import java.util.List;

public class T3 {

	public static void main(String[] args) {
		List list = new ArrayList();
		for(;;){
			Goods goods=new Goods();
			list.add(goods);
			System.out.println(list.size());
//			LockSupport.parkNanos(TimeUnit.MICROSECONDS.toNanos(500));

		}

	}

}

jvm参数:

-Dfile.encoding=UTF-8 -Xms1M -Xmx1M -XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=E:\\tmp

其中XX:+HeapDumpOnOutOfMemoryError  -XX:HeapDumpPath=E:\\tmp 设置,在抛出内存溢出时候,会dump出内存快照

 

运行后 内存溢出,生成dump快照文件:

31617
31618
java.lang.OutOfMemoryError: Java heap space
Dumping heap to E:\\tmp\java_pid25200.hprof ...
Heap dump file created [2675391 bytes in 0.058 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3210)
    at java.util.Arrays.copyOf(Arrays.java:3181)
    at java.util.ArrayList.grow(ArrayList.java:261)
    at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
    at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
    at java.util.ArrayList.add(ArrayList.java:458)
    at cn.n1.t1.T3.main(T3.java:14)

使用mat打开快照文件:

file-open heap dump

jvm内存溢出之Memory Analizer分析内存快照_第3张图片

看到a b 有内存泄漏的嫌疑

点击tree

jvm内存溢出之Memory Analizer分析内存快照_第4张图片

shallow heap 对象占用内存。

retained heap 对象及对象引用的对象占用的内存。

红点:Gc Roots可达。

System Class 系统对象,不是我们需要分析内存泄漏的地方。

点开第一个:

jvm内存溢出之Memory Analizer分析内存快照_第5张图片

jvm内存溢出之Memory Analizer分析内存快照_第6张图片

发现ArrayList里有大量对象 Goods,因此分析得出此处存在内存泄漏的风险。

 

你可能感兴趣的:(jvm)