接續著上篇,這篇要說明的是如何自動導出hprof文件,針對自動導出又有分兩種狀況:已是運行中的程序要調整JVM參數、剛要執行的程序帶上自動導出的參數,以下我示範的是剛要執行的程序帶上自動導出的參數;已在運行中要調整的話,請參考:Day10-JDK查看虛擬機配置訊息工具:jinfo。
當程序遇到out of memory (OOM)
時,會馬上停止,一些系統的相關訊息也會隨之消失,所以自動導出文件這動作就顯得相當重要。
以下兩個參數是自動導出的關鍵:
-XX:+HeapDumpOnOutOfMemoryError
:程序發生OOM時,可產生內存快照。-XX:HeapDumpPath=<filename.hrpof>
:可指定內存快照保存位置。package Controller;
import java.util.ArrayList;
public class JmapDump{
public static void main(String[] args) throws InterruptedException{
ArrayList<String[]> list = new ArrayList<>();
for(int x = 0;x<2001;x++){
String[] arr = new String[1024*x];
list.add(arr);
Thread.sleep(50);
}
}
}
編譯與執行的指令說明,請參考Day4-java語言編譯器:javac & 運行工具:java (上)
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=auto.hprof Controller/JmapDump
java.lang.OutOfMemoryError: Java heap space
的狀況,並且自動匯出文件
出現java.lang.OutOfMemoryError: Java heap space
後,下一行的顯示訊息是Dumping heap to auto.hprof ...
,等它整個訊息顯示完後,到HeapDumpPath
設定的路徑下查看是否有hprof的文件
這工具就是促使我開始研究JDK內有哪些工具的契機!!不得不說,jmap在遇到OOM時真的很好用~
當時我遇到的狀況是,公司的網站不定期就會整個掛掉,偏偏那時又是流量高峰的時候,當時就覺得很困惑,沒動過code,好好的網站怎麼會突然出現問題,使用了jmap搭配接下來要講的工具,讓我能在網站上眾多的功能中不需要大海撈針找問題!!