1. 程式人生 > >java的heap dump觸發和分析[轉]

java的heap dump觸發和分析[轉]

為了分析java應用的記憶體洩漏,使用thread dump往往解決不了問題。使用jstat【eg:jstat -gcutil pid 1000 5】工具檢視執行的java應用的heap size,perm size ,survivor ratio等,當時你無法知道是什麼物件把堆填滿了。

什麼是 Java heap dump

 首先需要搞懂什麼是java heap,java heap是分配給例項類和陣列物件執行資料區,所有java執行緒在執行期間共享heap中的資料。Java heap dump相當於java應用在執行的時候在某個時間點上打了個快照(snapshot)。

觸發 Java heap dump

有以下方法出發heap dump

•使用JAVAHOME/bin/jmapdumpegjmapdump:format=b,file=/home/longhao/heamdump.out使JAVA_HOME/bin/jcosole中的MBean,到MBean>com.sun.management>HotSpotDiagnostic>操作>dumpHeap中,點選 dumpHeap按鈕。生成的dump檔案在java應用的根目錄下面。
•在應用啟動時配置相關的引數 -XX:+HeapDumpOnOutOfMemoryError,當應用丟擲OutOfMemoryError時生成dump檔案。
•使用hprof。啟動虛擬機器加入-Xrunhprof:head=site,會生成java.hprof.txt檔案。該配置會導致jvm執行非常的慢,不適合生產環境。

分析 Java heap dump

1:使用IBM HeapAnalyzer

 IBM HeapAnalyzer是一款免費的JVM記憶體堆的圖形分析工具,它可以有效的列舉堆的記憶體使用狀況,幫助分析Java記憶體洩漏的原因。

 下載解壓後有一個ha413.jar,執行: java -Xmx512m -jar ha413.jar /home/longhao/heapdump.out

2:jhat

 jhat(Java Head Analyse Tool )是用來分析java堆的命令,可以將堆中的物件以html的形式顯示出來,包括物件的數量,大小等等,並支援物件查詢語言OQL,分析相關的應用後,可以通過http://localhost:7000來訪問分析結果。

 示例: $JAVA_HOME/bin/jhat -J-Xmx512m /home/longhao/dump.out

3:Eclipse MemoryAnalyzer

 Eclipse Memory Analyzer是一個快速並且功能強大的Java heap分析器,能夠幫助你查詢記憶體洩漏和減少記憶體消耗。在File>Acquire Heap Dump>configure>HPROF jmap dump provider設定一下分析應用的JDK,點選相關應用列表來生成heap dump並分析。

 在socket,nio中的有些API中,申請的記憶體是直接想OS要的,在堆中分析記憶體是檢視不到的,可以通過-XX:MaxDirectMemorySize=來設定應用向OS直接申請的最大記憶體數。