1. 程式人生 > >java 遇到未知異常使程式崩潰,輸出jvm的dump崩潰資訊到指定檔案,然後殺死此程序

java 遇到未知異常使程式崩潰,輸出jvm的dump崩潰資訊到指定檔案,然後殺死此程序

1.我們首先需要獲取當前java程序的pid。方法為:

  //檢視當前程序pid
    private static void getPID(){
        RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
        String name = runtime.getName();
        System.out.println("當前程序的標識為:"+name);
        int index = name.indexOf("@");
        if (index != -1) {
            int
pid = Integer.parseInt(name.substring(0, index)); System.out.println("當前程序的PID為:"+pid); } }

假設該程序pid為8643
windows下執行命令:taskkill /pid 8436 /f 來強制終止該pid程序。
linux下執行:kill-9 8643來強制終止該pid程序

2.匯出jvm中記憶體資訊
jmap -dump:format=b,file=檔名 [pid]

3.java方法呼叫shell命令

  String cmds = "jmap -dump:format=b,file=e:/jmap/"+System.currentTimeMillis()+".hprof  "+pid;
    Process pro = Runtime.getRuntime().exec(cmds);
    pro.waitFor();
    in = pro.getInputStream();
    BufferedReader read = new BufferedReader(new InputStreamReader(in));
 String result = read.readLine();
 System.out.println(result);

 上述程式碼就可以將制定pid的java程序的dump檔案以檔案的形式輸出到制定目錄下。
 問題:在cmds命令中,hprof與pid之間一定要有空格。

4.有些linux系統可能不能執行jmap命令:此時需要yum安裝即可。

yum install java-1.8.0-openjdk-devel-debug

5.輸出的java dump檔案格式是.hprof格式的。我們需要特定的工具才能解析。
這裡推薦MAT(Eclipse的一種外掛)。官網下載地址如下,下載完解壓即可。

MAT是有兩種安裝方式的,這一點與其他eclipse外掛略有不同。
一種安裝方式是將MAT當做eclipse的外掛進行安裝:啟動Eclipse –> Help –> Eclipse Marketplace,然後搜尋Memory Analyzer,安裝,重啟eclipse即可。
另外一種安裝方式是將MAT作為一個獨立的軟體進行安裝:去官網

http://www.eclipse.org/mat/downloads.php,根據作業系統版本下載最新的MAT。下載後解壓就可以運行了。

修改MAT配置:
MAT 軟體版本解壓後目錄內有個MemoryAnalyzer.ini檔案,該檔案裡面有個Xmx引數,該引數表示最大記憶體佔用量,預設為1024m,根據堆轉儲檔案大小修改該引數即可。
1. MemoryAnalyzer.ini中的引數一般預設為-vmargs– Xmx1024m,這就夠用了。假如你機器的記憶體不大,改大該引數的值,會導致MemoryAnalyzer啟動時,報錯:Failed to create the Java Virtual Machine。
2.當你匯出的dump檔案的大小大於你配置的1024m(說明1中,提到的配置:-vmargs– Xmx1024m),MAT輸出分析報告的時候,會報錯:An internal error occurred during: “Parsing heap dump from XXX”。適當調大說明1中的引數即可。

執行MemoryAnalyzer.exe開啟軟體,然後開啟file–openfile選擇前面生成的.hprof檔案。就可以看到資訊。如下圖。
這裡寫圖片描述
在首頁上比較有用的是Histogram和Leak Suspects。
點選Histogram,看到下圖:
這裡寫圖片描述

點選Leak Suspects會在堆轉儲檔案同目錄內生成一個Leak Suspects.zip檔案,同時也會從首頁跳轉到Leak Suspects頁面。
這裡寫圖片描述

在Leak Suspects頁面會給出可能的記憶體洩露,如上圖所示有一個可能的記憶體洩露。這個問題是jar包或jdk裡面的,所以我們不用管。(因為我這個生成.hprof檔案並不是記憶體洩漏時生成的,而是為了測試,強制生成的)
我們可以點選 details進去檢視詳細資訊。
這裡寫圖片描述

在詳情頁面Shortest Paths To the Accumulation Point表示GC root到記憶體消耗聚集點的最短路徑,如果某個記憶體消耗聚集點有路徑到達GC root,則該記憶體消耗聚集點不會被當做垃圾被回收。

在All Accumulated Objects by Class列舉了該物件所儲存的所有內容。