簡介
jmap是一個多功能指令,它可以生成Java應用的dump檔案,也可以檢視堆内對象的統計資訊、檢視ClassLoader資訊和finalizer隊列等,但是jmap會将整個JVM的線程全部暫停,是以在生産環境中慎重jmap指令。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL90zdiFjSzIGasdUZxgnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2MDO0UjNyADMwEzMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
參數
- option:選項參數
- pid:程序ID
- executable:生成核心dump的Java可執行檔案
- core:需要列印配置資訊的核心檔案
- server_id:唯一服務ID,若一台主機上開啟了多個遠端debug服務
- remote server IP or hostname:遠端debug服務的主機名或IP
option選項
- none:檢視程序的記憶體映像資訊,和Solaris的pmap指令類似
- heap:顯示JVM堆詳細資訊
- histo[:live]:列印堆中對象的統計資訊,
子選項是指定僅列印出存活的對象:live
- clstats:列印類加載器資訊
- finalizerinfo:顯示正在準備被回收的對象資訊
- dump:<dump-options>:生成堆轉儲快照
- live:僅轉儲堆中存活的對象
- format=b:二進制方式
- file:堆轉儲快照檔案
- F:當dump或histo沒有響應時,使用該參數可以強制執行,但是若子選項是
則使用-F也無效:live
- h | help:顯示指令的幫助資訊
- j<flag>:給運作中的JVM傳參數給jmap
示例
準備:啟動一個死循環的main方法
通過jps指令檢視應用的pid
pid:10456
-
jmap pid
檢視程序的記憶體映像資訊
JVM指令之jmap -
jmap -heap pid
顯示JVM堆詳細資訊
JVM指令之jmap -
jmap -histo:live pid
顯示堆中存活的對象的統計資訊,資訊包含每個存活的Java類、對象數量、記憶體大小(從大到小排列,機關:位元組)、類全限定名
JVM指令之jmap -
jmap -clstats pid
列印類加載器資訊,資訊包含類加載器名稱、所加載的類的數量、所加載的類的大小、父加載器、存活狀态、加載器位址等
JVM指令之jmap -
jmap -finalizerinfo pid
列印正在等待被回收的對象資訊
表示目前并無待回收對象JVM指令之jmap -
jmap -dump:format=b,file=heapdump.hprof pid
生成堆轉儲快照dump檔案,以hprof二進制格式轉儲Java堆資訊到指定的檔案中,可以使用live子選項指定隻将堆中存活的對象轉儲出來,生成的檔案可以使用jhat指令或者MAT工具解析
JVM指令之jmap
總結
在jmap執行時,JVM為了保證dump的資訊的可靠性,會暫停應用的所有線程,如果堆内對象過大的話,這個過程會非常耗時,在生産環境慎用。
但是當生産服務處了問題,這個時候不得不使用的話,那就用吧,應用都出問題了,還在意會不會STW幹啥。