1. 程式人生 > >jdk工具之jhat命令(Java Heap Analyse Tool)概述

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)執行物件查詢語句