天天看點

JVM指令之jmap

簡介

jmap是一個多功能指令,它可以生成Java應用的dump檔案,也可以檢視堆内對象的統計資訊、檢視ClassLoader資訊和finalizer隊列等,但是jmap會将整個JVM的線程全部暫停,是以在生産環境中慎重jmap指令。

JVM指令之jmap
參數
  • 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沒有響應時,使用該參數可以強制執行,但是若子選項是

    :live

    則使用-F也無效
  • h | help:顯示指令的幫助資訊
  • j<flag>:給運作中的JVM傳參數給jmap

示例

準備:啟動一個死循環的main方法

通過jps指令檢視應用的pid

pid:10456

  1. jmap pid

    檢視程序的記憶體映像資訊

    JVM指令之jmap
  2. jmap -heap pid

    顯示JVM堆詳細資訊

    JVM指令之jmap
  3. jmap -histo:live pid

    顯示堆中存活的對象的統計資訊,資訊包含每個存活的Java類、對象數量、記憶體大小(從大到小排列,機關:位元組)、類全限定名

    JVM指令之jmap
  4. jmap -clstats pid

    列印類加載器資訊,資訊包含類加載器名稱、所加載的類的數量、所加載的類的大小、父加載器、存活狀态、加載器位址等

    JVM指令之jmap
  5. jmap -finalizerinfo pid

    列印正在等待被回收的對象資訊

    JVM指令之jmap
    表示目前并無待回收對象
  6. jmap -dump:format=b,file=heapdump.hprof pid

    生成堆轉儲快照dump檔案,以hprof二進制格式轉儲Java堆資訊到指定的檔案中,可以使用live子選項指定隻将堆中存活的對象轉儲出來,生成的檔案可以使用jhat指令或者MAT工具解析

    JVM指令之jmap

總結

在jmap執行時,JVM為了保證dump的資訊的可靠性,會暫停應用的所有線程,如果堆内對象過大的話,這個過程會非常耗時,在生産環境慎用。

但是當生産服務處了問題,這個時候不得不使用的話,那就用吧,應用都出問題了,還在意會不會STW幹啥。