jhat 是Java堆分析工具(Java heap Analyzes Tool). 在JDK6u7之后成為標配. 使用該命令需要有一定的Java開發經驗,官方不對此工具提供技術支持和客戶服務。
用法:
jhat [ options ] heap-dump-file
參數:
-
options 可選命令行參數,請參考下面的 Options
-
heap-dump-file 要查看的二進制Java堆轉儲文件(Java binary heap dump file)。 如果某個轉儲文件中包含了多份 heap dumps, 可在文件名之后加上
#<number>的方式指定解析哪一個 dump, 如:myfile.hprof#3
示例
jmap轉儲可以使用如下方式:
jmap -dump:file=DumpFileName.txt,format=b pid
例如:
C:\Users\Administrator\Desktop>jmap -dump:file=D:/javaDump.hprof,format=b 3614 Dumping heap to D:\javaDump.hprof ... Heap dump file created
其中, 3614 是此次啟動Tomcat后,通過tasklist,或任務管理器查看到的 java進程的ID,一般來說, jmap 需要和 java的版本一致或者兼容,才能成功導出. 如果不知道如何使用,直接輸入 jmap, 或者 jmap -h 則可以看到提示信息.
然后分析時使用jhat命令,如下所示:
jhat -J-Xmx1024m D:/javaDump.hprof
...... 一堆信息 ...
Snapshot resolved.
Started HTTP server on port 7000 Server is ready.
而 jhat 的 -J 參數是因為默認JVM的堆內存可能不足以加載整個dump 文件. 根據需要進行調整. 根據提示知道端口號是 7000,
接着使用瀏覽器訪問 http://localhost:7000/ 即可看到相關信息.
詳細說明
jhat 命令解析Java堆轉儲文件,並啟動一個 web server. 然后用瀏覽器來查看/瀏覽 dump 出來的 heap. jhat 命令支持預先設計的查詢, 比如顯示某個類的所有實例. 還支持 對象查詢語言(OQL, Object Query Language)。 OQL有點類似SQL,專門用來查詢堆轉儲。 OQL相關的幫助信息可以在 jhat 命令所提供的服務器頁面最底部. 如果使用默認端口, 則OQL幫助信息頁面為: http://localhost:7000/oqlhelp/
Java生成堆轉儲的方式有多種:
- 使用
jmap -dump選項可以在JVM運行時獲取 heap dump. (可以參考上面的示例)詳情參見: jmap(1) - 使用
jconsole選項通過 HotSpotDiagnosticMXBean 從運行時獲得堆轉儲。 請參考: jconsole(1) 以及HotSpotDiagnosticMXBean的接口描述:http://docs.oracle.com/javase/8/docs/jre/api/management/extension/com/sun/management/HotSpotDiagnosticMXBean.html. - 在虛擬機啟動時如果指定了
-XX:+HeapDumpOnOutOfMemoryError選項, 則拋出 OutOfMemoryError 時, 會自動執行堆轉儲。 - 使用
hprof命令。 請參考 A Heap/CPU Profiling Tool:http://docs.oracle.com/javase/8/docs/technotes/samples/hprof.html
Options
-stack false|true
關閉對象分配調用棧跟蹤(tracking object allocation call stack)。 如果分配位置信息在堆轉儲中不可用. 則必須將此標志設置為 false. 默認值為 true.
-refs false|true
關閉對象引用跟蹤(tracking of references to objects)。 默認值為 true. 默認情況下, 返回的指針是指向其他特定對象的對象,如反向鏈接或輸入引用(referrers or incoming references), 會統計/計算堆中的所有對象。
-port port-number
設置 jhat HTTP server 的端口號. 默認值 7000.
-exclude exclude-file
指定對象查詢時需要排除的數據成員列表文件(a file that lists data members that should be excluded from the reachable objects query)。 例如, 如果文件列列出了 java.lang.String.value , 那么當從某個特定對象 Object o 計算可達的對象列表時, 引用路徑涉及 java.lang.String.value 的都會被排除。
-baseline exclude-file
指定一個基准堆轉儲(baseline heap dump)。 在兩個 heap dumps 中有相同 object ID 的對象會被標記為不是新的(marked as not being new). 其他對象被標記為新的(new). 在比較兩個不同的堆轉儲時很有用.
-debug int
設置 debug 級別. 0 表示不輸出調試信息。 值越大則表示輸出更詳細的 debug 信息.
-version
啟動后只顯示版本信息就退出
-h
顯示幫助信息並退出. 同 -help
-help
顯示幫助信息並退出. 同 -h
-J< flag >
因為 jhat 命令實際上會啟動一個JVM來執行, 通過 -J 可以在啟動JVM時傳入一些啟動參數. 例如, -J-Xmx512m 則指定運行 jhat 的Java虛擬機使用的最大堆內存為 512 MB. 如果需要使用多個JVM啟動參數,則傳入多個 -Jxxxxxx.
另請參閱:
原文鏈接: https://docs.oracle.com/javase/jp/8/technotes/tools/unix/jhat.html
