Java的記憶體映像工具,jmap,Memory Map for Java,用于生成堆轉儲快照,一般成為heapdump或者dump檔案,出了擷取dump檔案,這個工具還可以查詢finalize執行隊列,Java堆和永久代的詳細資訊,如空間使用率、目前使用的是哪種收集器等。
先來看一下這個指令是怎麼用的:

由此可見jmap的指令格式為:jmap [option]
option參數為:
no option: 檢視程序的記憶體映像資訊,類似 Solaris pmap 指令。heap: 顯示Java堆詳細資訊histo[:live]: 顯示堆中對象的統計資訊clstats:列印類加載器資訊finalizerinfo: 顯示在F-Queue隊列等待Finalizer線程執行finalizer方法的對象dump::生成堆轉儲快照F: 當-dump沒有響應時,使用-dump或者-histo參數. 在這個模式下,live子參數無效.help:列印幫助資訊J:指定傳遞給運作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: 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 将運作時參數傳遞給運作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自帶的工具,給予我們分析和排查問題帶來了極大的友善,掌握這些工具,或者其他更強大和更完美的工具,讓我們分析線上問題的時候,不再手足無措。