Java內存映像工具jmap及虛擬機堆轉儲快照分析工具jhat

      Java的內存映像工具,jmap,Memory Map for Java,用於生成堆轉儲快照,一般成爲heapdump或者dump文件,出了獲取dump文件,這個工具還可以查詢finalize執行隊列,Java堆和永久代的詳細信息,如空間使用率、當前使用的是哪種收集器等。

先來看一下這個命令是怎麼用的:

由此可見jmap的命令格式爲:jmap [option] <pid>

option參數爲:

no option: 查看進程的內存映像信息,類似 Solaris pmap 命令。
heap: 顯示Java堆詳細信息
histo[:live]: 顯示堆中對象的統計信息
clstats:打印類加載器信息
finalizerinfo: 顯示在F-Queue隊列等待Finalizer線程執行finalizer方法的對象
dump:<dump-options>:生成堆轉儲快照
F: 當-dump沒有響應時,使用-dump或者-histo參數. 在這個模式下,live子參數無效.
help:打印幫助信息
J<flag>:指定傳遞給運行jmap的JVM的參數

1、jmap -heap pid,顯示Java堆詳細信息,包括使用的GC算法、堆配置信息和各內存區域內存使用信息

2、jmap -histo:live pid,顯示堆中對象的統計信息,如果指定了live子選項,則只計算活動的對象。

打印的統計信息如下(包括每個Java類、對象數量、內存大小(單位:字節)、完全限定的類名):

3、jmap -clstats pid,打印類加載器信息

-clstats是-permstat的替代方案,在JDK8之前,-permstat用來打印類加載器的數據,打印Java堆內存的永久保存區域的類加載器的智能統計信息。

4、jmap -finalizerinfo pid,打印等待終結的對象信息

5、jmap -dump:<dump-options> pid,生成堆轉儲快照dump文件

以hprof二進制格式轉儲Java堆到指定filename的文件中。live子選項是可選的。如果指定了live子選項,堆中只有活動的對象會被轉儲。想要瀏覽heap dump,你可以使用jhat(Java堆分析工具)讀取生成的文件,我們先來生成這個文件:


生成了這個堆轉儲快照,接下來就到了jhat命令行工具的使用了,jhat是虛擬機堆轉儲快照分析工具,該命令與jmap配合使用,來分析jmap生成的堆轉儲快照,是對好基友。jhat內置了一個微型的HTTP/HTML服務器,生成dump文件的分析結果後,可以在瀏覽器中查看。

注意:一般在生成環境中,不使用jhat命令行工具在部署服務器上直接來分析堆轉儲快照,因爲分析堆轉儲快照是一個耗時且消耗硬件資源的過程,還有就是jhat的分析功能相對來說比較簡陋,有比jhat更爲先進的工具,例如EMA,IBM HA等,都是更強大更專業的分析功能。

先來看一下它的使用方法:

這些可選擇的選項含義是:

-J<flag> 
將運行時參數傳遞給運行jhat的JVM。例如,-J-Xmx512m設置使用的最大堆內存大小爲512MB。
-stack false/true
關閉跟蹤對象分配調用堆棧。注意,如果heap dump中的分配位置信息不可用,你必須設置此標識爲false。此選項的默認值爲true。
-refs false/true
關閉對象的引用跟蹤。默認爲true。默認情況下,反向指針(指向給定對象的對象,又叫做引用或外部引用)用於計算堆中的所有對象.
-port port-number
設置jhat的HTTP服務器的端口號。默認爲7000。
-exclude exclude-file
指定一個數據成員列表的文件,這些數據成員將被排除在”reachable objects”查詢的範圍之外。舉個例子,如果文件列有java.lang.String.value,那麼,當計算指定對象”o”的可達對象列表時,涉及到java.lang.String.value字段的引用路徑將會被忽略掉。
-baseline baseline-dump-file
指定一個基線heap dump。在兩個heap dump(當前heap dump和基線heap dump)中存在相同對象ID的對象,不會被標記爲”new”。其他的對象將被標記爲”new”。這在比較兩個不同的heap dump時非常有用。
-debug int
設置此工具的調試級別。0意味着沒有調試輸出。設置的值越高,輸出的信息就越詳細。
-version 
報告版本號並退出。
-h|-help
輸出幫助信息並退出。

輸入命令來分析剛纔生成的堆轉儲文件:

打開瀏覽器來訪問,端口爲默認的7000:

在這個頁面的最下方,有個Other Queries,點擊不同的鏈接可以展示不同的內容:

比如我們點擊“Show heap histogram” 鏈接,展示堆快照直方圖:

這些JDK自帶的工具,給予我們分析和排查問題帶來了極大的方便,掌握這些工具,或者其他更強大和更完美的工具,讓我們分析線上問題的時候,不再手足無措。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章