Eclipse Memory Analyzer入門
阿新 • • 發佈:2018-11-11
下載地址: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%,,顯然是它搞得鬼,然後別的再繼續學習。。。