dump文件是java虛擬機內存在某一時間點的快照文件,通常是.hprof文件,下面本身模擬一下本地內存溢出,生成dump文件,而後經過mat工具分析的過程。html
要想本地模擬oom異常,那麼建議將堆內存設置的小一點,那樣容易觸發java
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${目錄} -Xms20m -Xmx20m
public class Test1 { public static void main(String[] args) { List<Person> personList = new ArrayList<>(); while (true){ Person person = new Person(); person.setDate(new Date()); person.setAge(20); person.setName("test"); personList.add(person); } } }
很明顯,一直建立Person對象,卻又沒法釋放,很快就內存溢出了。jvm
java.lang.OutOfMemoryError: GC overhead limit exceeded Dumping heap to java_pid21892.hprof ... Heap dump file created [33907612 bytes in 0.152 secs] Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded at Test1.main(Test1.java:15)
生成的文件名稱是java_pid21892.hprof,在項目的根目錄下面,文件大小33.9M工具
預覽界面,能清楚的看到整個堆總內存18.7M,可是有18.3M的內存被一個類的對象佔用了線程
Histogram柱狀圖:以class類的維度展現每一個class類的實例存在的個數、 佔用的 [Shallow內存] 和 [Retained內存] 大小,能夠分別排序顯示,從圖中看到,Person類的實例佔用內存最大,而它就是沒有回收引發內存溢出的對象3d
Dominator Tree支配樹:該視圖以實例對象的維度展現當前堆內存中Retained Heap佔用最大的對象,以及依賴這些對象存活的對象的樹狀結構code
展開會展現下一層子節點,能夠這麼理解:父節點引用了子節點,子節點沒有被回收,因此父節點也無法被回收htm
Thread Overview::能夠看到線程棧/線程對象信息對象
把線程進行一個排序,一樣能看到引發內存溢出的是最上面線程裏面的Person對象blog
能夠選擇展現什麼樣的報告信息,咱們最開始打開dump文件時,會彈出一個窗口讓咱們選擇,若是選錯了這裏能夠從新選擇
這裏的功能比較強大,主要用來分析GC引用關係,每一個對象到GCRoot的引用,能夠在柱狀圖或者支配樹界面裏選擇可疑對象進行分析,比較經常使用的兩個是:Path to GC ROOTS和Merge Shortest Paths to GC Roots,固然選中對象雙擊,也能進入到這樣的界面
Group分組功能:在 Histogram視圖 和 Domiantor Tree視圖時可操做,即以什麼樣的維度展現
將分析報告以什麼樣的格式導出,可選的有html、csv、txt。便於在團隊合做分析dump文件時,無需將龐大的dump文件拷貝過去,只須要生成以上格式的文件,就能很方便的轉移。
以上用做筆記,方便下次本人查閱爲主。