開發、應用中老是會遇到OutOfMemory異常,而且常常是過一段時間內存才被吃光,這里可以利用java heap dump出jvm內存鏡像,然后再對其進行分析來查找問題。
《java heap dump觸發和分析》這篇文章很好的介紹了heap dump的方法和分析的工具。
平常利用
jmap -dump:format=b,file=/path/file.hprof
<pid> 這個java自帶的工具來dump heap很方便,但當內存溢出問題發生的比較快的情況下,該命令就有可能來不及或無效。
這個時候
在應用啟動時配置相關的參數
-XX:+HeapDumpOnOutOfMemoryError
就比較方便,當然可以再加上
-
XX:HeapDumpPath=
/path/file.hprof
來指定文件的輸出路徑。
不知道怎么用這些參數?就在你啟動應用的時候加,如:
/usr/lib/jvm/java-1.6.0/bin/java -server -Xms1536m -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=64m -XX:MaxPermSize=64m
-XX:+HeapDumpOnOutOfMemoryError
-
XX:HeapDumpPath=
/path/file.hprof
-Djava.ext.dirs=/xxx/lib/ ClassName
在
《java heap dump觸發和分析》里有介紹到分析工具,個人覺得利用java自帶的
$JAVA_HOME/bin/jhat -J-Xmx512m /path/file.hprof
工具看分析結果不是很友好,當然這情況緊急、身邊又沒工具的情況下也是一個好的選擇。但個別比較推薦里面介紹的
IBM HeapAnalyzer(沒用過)和
MemoryAnalyzer,關於
MemoryAnalyzer的介紹可以看下
使用 Eclipse Memory Analyzer 進行堆轉儲文件分析里的介紹。
