1. 程式人生 > >Eclipse Memory Analyzer入門

Eclipse Memory Analyzer入門

下載地址:http://www.eclipse.org/mat/downloads.php

下載好相應版本,無需安裝,可以直接使用。

開啟eclipse,寫一個模擬outofmemory的小程式如下:

package jvm;

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

/**
 * 模擬記憶體溢位
 * @author BarryLee
 * @2018年11月7日@上午10:16:20
 */
public class Test01 {
	public static void main(String[] args) {
		List<Test01>list = new ArrayList<>();
		while(true) {
			list.add(new Test01());
		}
	}
}

先跑一次這個程式,然後停掉jvm(只是為了等等方便找到這個程式),然後右鍵run as  --  run configurations   --  確定左欄選中的是當前程式,右欄點選arguments -- 在VM arguments中輸入:

-XX:+HeapDumpOnOutOfMemoryError  -Xms20m -Xmx20m

-XX:+HeapDumpOnOutOfMemoryError是生成記憶體溢位的檔案

-Xms20m是初始堆大小

-Xmx20m是最大對大小

想了解這些引數可以學習jvm

點選apply  -- run

然後控制檯會列印如下提示:

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid5852.hprof ...
Heap dump file created [28043949 bytes in 1.464 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:265)
	at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)
	at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231)
	at java.util.ArrayList.add(ArrayList.java:462)
	at jvm.Test01.main(Test01.java:15)

這時開啟專案位置

這時開啟工具 - MemoryAnalyzer.exe

file -- open file,開啟剛剛生成的檔案,檢視detail可以看到

shallow heap 是這個位置的佔用的記憶體大小,不包括引用的

retained heap如名,包括了引用的大小

可以看到是這個obj佔用了記憶體達到了97%,,顯然是它搞得鬼,然後別的再繼續學習。。。