jdk工具之jhat命令(Java Heap Analyse Tool)概述
Jhat用於對JAVA heap進行離線分析的工具,他可以對不同虛擬機器中匯出的heap資訊檔案進行分析,如LINUX上匯出的檔案可以拿到WINDOWS上進行分析,可以查詢諸如記憶體方面的問題。
不過jhat和MAT比較起來,就沒有MAT那麼直觀了,MAT是以圖形介面的方式展現結果
一、hat命令 -- Java Head Analyse Tool介紹
用途:是用來分析Java堆的命令,可以將堆中的物件以html的形式顯示出來,包括物件的數量,大小等等,並支援物件查詢語言。
jhat -help
引數
-J< flag >
因為 jhat 命令實際上會啟動一個JVM來執行, 通過 -J 可以在啟動JVM時傳入一些啟動引數. 例如, -J-Xmx512m 則指定執行 jhat 的Java虛擬機器使用的最大堆記憶體為 512 MB. 如果需要使用多個JVM啟動引數,則傳入多個 -Jxxxxxx.
-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
啟動後只顯示版本資訊就退出。
二、jhat中重點內容關注
檢視jhat展示的網頁資訊中,一般檢視堆異常情況主要看這個兩個部分: Show instance counts for all classes (excluding platform),平臺外的所有物件資訊。Show heap histogram 以樹狀圖形式展示堆情況。
這兩部分內容在首頁的http://ip:7000頁面的最下面中的Other Queries裡的兩個連結中進入。
三、示例
第一步:匯出堆
[[email protected] appTest]$ jmap -dump:live,file=b.bin 81301 Dumping heap to /home/appdeploy/appTest/b.bin ... Heap dump file created [[email protected] appTest]$
第二步:分析堆檔案
[[email protected] appTest]$ jhat test.bin
第三步:檢視html
平臺外的所有物件資訊
有時你dump出來的堆很大,在啟動時會報堆空間不足的錯誤,可以使用如下引數:jhat -J-Xmx512m <heap dump file>
對於jhat啟動後顯示的html頁面中功能:
(1)顯示出堆中所包含的所有的類 (2)從根集能引用到的物件 (3)顯示平臺包括的所有類的例項數量
(4)顯示平臺外的所有物件資訊
(5)堆例項的分佈表(堆直方圖)
(6)執行物件查詢語句