本地模擬內存溢出並分析Dump文件

java Dump文件分析

前言

dump文件是java虛擬機內存在某一時間點的快照文件,通常是.hprof文件,下面本身模擬一下本地內存溢出,生成dump文件,而後經過mat工具分析的過程。html

配置虛擬機參數

要想本地模擬oom異常,那麼建議將堆內存設置的小一點,那樣容易觸發java

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${目錄} -Xms20m -Xmx20m
  1. -XX:+HeapDumpOnOutOfMemoryError表示jvm發生oom異常時,自動生成dump文件,文件格式通常是:java_pid20804.hprof ,其中20804是java進程id
  2. -XX:HeapDumpPath=${目錄},表示生成dump文件的目錄,也能夠指定文件名稱,例如:-XX:HeapDumpPath=${目錄}/java_heapdump.hprof,此步驟實驗出了點問題,暫時跳過
  3. -Xms:表示給jvm分配的初始化堆內存
  4. -Xmx:表示最大堆內存

模擬oom異常的程序

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工具

MAT工具分析dump文件

預覽

預覽界面,能清楚的看到整個堆總內存18.7M,可是有18.3M的內存被一個類的對象佔用了線程

功能介紹

  1. Histogram柱狀圖:以class類的維度展現每一個class類的實例存在的個數、 佔用的 [Shallow內存] 和 [Retained內存] 大小,能夠分別排序顯示,從圖中看到,Person類的實例佔用內存最大,而它就是沒有回收引發內存溢出的對象3d

  2. Dominator Tree支配樹:該視圖以實例對象的維度展現當前堆內存中Retained Heap佔用最大的對象,以及依賴這些對象存活的對象的樹狀結構code

    展開會展現下一層子節點,能夠這麼理解:父節點引用了子節點,子節點沒有被回收,因此父節點也無法被回收htm

  3. Thread Overview::能夠看到線程棧/線程對象信息對象

    把線程進行一個排序,一樣能看到引發內存溢出的是最上面線程裏面的Person對象blog

  4. 能夠選擇展現什麼樣的報告信息,咱們最開始打開dump文件時,會彈出一個窗口讓咱們選擇,若是選錯了這裏能夠從新選擇

  5. 這裏的功能比較強大,主要用來分析GC引用關係,每一個對象到GCRoot的引用,能夠在柱狀圖或者支配樹界面裏選擇可疑對象進行分析,比較經常使用的兩個是:Path to GC ROOTS和Merge Shortest Paths to GC Roots,固然選中對象雙擊,也能進入到這樣的界面

  6. Group分組功能:在 Histogram視圖 和 Domiantor Tree視圖時可操做,即以什麼樣的維度展現

  7. 將分析報告以什麼樣的格式導出,可選的有html、csv、txt。便於在團隊合做分析dump文件時,無需將龐大的dump文件拷貝過去,只須要生成以上格式的文件,就能很方便的轉移。

總結

以上用做筆記,方便下次本人查閱爲主。

相關文章
相關標籤/搜索