1. 程式人生 > >理解JVM(三):JVM命令工具

理解JVM(三):JVM命令工具

jps(JVM Process Status Tool)

虛擬機器程序狀況工具,可以列出正在執行的虛擬機器程序,並顯示虛擬機器執行主類(MainClass,main()函式所在的類)名稱以及這些程序的本地虛擬機器唯一ID(Local Virtual Machine Identifier,LVMID)。

  • 命令格式:jps[options][hostid]
  • 引數:
    • -q:只輸出LVMID,省略主類名稱
    • -m:輸出虛擬機器程序啟動時傳給主類main()函式的引數
    • -l:輸出主類全名,如果程序執行的時jar包則輸出jar路徑
    • -v:輸出虛擬機器程序啟動時的jvm引數

jstat(JVM Statistics Monitoring Tool)

虛擬機器統計資訊監視工具,用於監視虛擬機器各種執行狀態資訊的命令列工具。它可以顯示本地或者遠端虛擬機器程序中的類裝載、記憶體、垃圾收集、JIT編譯等執行資料,在沒有GUI圖形介面,只提供了純文字控制檯環境的伺服器上,它將是執行期定位虛擬機器效能問題的首選工具。

  • 命令格式:jstat[option vmid[interval[s|ms][count]]]
  • 對於命令格式中的VMID與LVMID需要特別說明一下:如果是本地虛擬機器程序,VMID與LVMID是一致的;如果是遠端虛擬機器程序,那VMID的格式應當是:[protocol:][//]lvmid[@hostname[:port]/servername]
  • 引數interval和count代表查詢間隔和次數,如果省略這兩個引數,說明只查詢一次。
// 每250毫秒查詢一次程序2764垃圾收集狀況,一共查詢20次
jstat-gc 2764 250 20
  • 引數:主要分為3類:類裝載、垃圾收集、執行
    期編譯狀況
    • -class:監視類裝載、解除安裝數量、總空間和類裝載消耗的時間
    • -gc:監視java堆狀況,包括Eden區、2個Survivor區、老年代、永久代等的容量,已用空間,GC時間合計等資訊
    • -gccapacity: 監視內容與-gc相同,但輸出主要關注Java堆各個區域使用到的最大、最小空間
    • -gcutil:監視內容與-gc相同,但輸出主要關注已使用空間佔總空間的百分百
    • -gccause:與-gcutil一樣,但會額外輸出上一次GC產生的原因
    • -gcnew:監視新生代GC的狀況
    • -gcnewcapacity:監視內容與-gcnew相同,輸出主要關注使用到的最大、最小空間
    • -gcold:監視老年代GC的狀況
    • -gcoldcapacity:監視內容與-gcold相同,輸出主要關注使用到的最大、最小空間
    • -gcpermcapacity:輸出永久代使用到的最大、最小空間
    • -compiler:輸出JIT編譯過的方法、耗時等資訊
    • -printcompilation:輸出已被JIT編譯的方法

jinfo(Configuration Info for Java)

Java配置資訊工具,可實時檢視和調整虛擬機器各項引數。
* 命令格式:jinfo[option]pid
* 引數:
* -flag:輸出指定args引數的值
* -flags:不需要args引數,輸出所有JVM引數的值
* -sysprops:輸出系統屬性,等同於System.getProperties()

jmap(Memory Map for Java)

Java記憶體映像工具用於生成堆轉儲快照(dump檔案)

  • 幾種獲得dump檔案的方式
    • jmap命令
    • -XX:+HeapDumpOnOutOfMemoryError引數,可以讓虛擬機器在OOM異常出現之後自動生成dump檔案
    • -XX:+HeapDumpOnCtrlBreak引數則可以使用[Ctrl]+[Break]鍵讓虛擬機器生成dump檔案
    • 在Linux系統下通過Kill-3命令傳送程序退出訊號也能拿到dump檔案
  • 命令格式:jmap[option]vmid
  • 引數:
    • -dump:生成堆轉儲快照
    • -finalizerinfo:顯示在F-Queue佇列等待Finalizer執行緒執行finalizer方法的物件
    • -heap:顯示Java堆詳細資訊
    • -histo:顯示堆中物件的統計資訊
    • -permstat:以CLassLoader為統計口徑顯示永久代記憶體狀態
    • -F:當-dump沒有響應時,強制生成dump快照

jhat(JVM Heap Analysis Tool)

與jmap搭配使用,用來分析jmap生成的堆轉儲快照。jhat內建了一個微型的HTTP/HTML伺服器,生成dump檔案的分析結果後,可以在瀏覽器中檢視。
* 命令格式:jhat [dumpfile]
* 不推薦使用此命令,有2個原因:
* 一般不會直接在伺服器上分析dump檔案,浪費伺服器資源。
* 分析功能簡陋,推薦用專業的視覺化分析工具,比如VisualVM

jstack(Stack Trace for Java)

Java堆疊跟蹤工具,用於生成虛擬機器當前時刻的執行緒快照。

執行緒快照就是當前虛擬機器內每一條執行緒正在執行的方法堆疊的集合,生成執行緒快照的主要目的是定位執行緒出現長時間停頓的原因,如執行緒間死鎖、死迴圈、請求外部資源導致的長時間等待等都是導致執行緒長時間停頓的常見原因。

執行緒出現停頓的時候通過jstack來檢視各個執行緒的呼叫堆疊,就可以知道沒有響應的執行緒到底在後臺做些什麼事情,或者等待著什麼資源。
* 命令格式:jstack[option]vmid
* 引數:
* -F:當正常輸出的請求不被響應時,強制輸出執行緒堆疊
* -l:除堆疊外,顯示關於鎖的附加資訊
* -m:如果呼叫本地方法,可顯示C/C++的堆疊
* 在JDK 1.5中,java.lang.Thread類新增了一個getAllStackTraces()方法用於獲取虛擬機器中所有執行緒的StackTraceElement物件。