JVM系列八(虛擬機性能監控命令).

  • 2020 年 3 月 15 日
  • 筆記

jps

JVM Process Status Tool,顯示指定系統內所有的 HotSpot 虛擬機進程。顯示資訊包括虛擬機執行主類名稱以及這些進程的本地虛擬機唯一ID(Local Virtual Machine Identifier,LVMID)。

jps [-q] [-mlvV] [<hostid>]
選項 作用
-q 只輸出 LVMID,省略主類的名稱
-m 輸出虛擬機進程啟動時傳遞給主類 main() 函數的參數
-l 輸出主類的名稱,如果進程執行的是 jar 包,輸出 jar 路徑
-v 輸出虛擬機進程啟動時 JVM 參數

jstat

JVM Statistics Monitoring Tool,用於收集 HotSpot 虛擬機各方面的運行數據。包括顯示本地或者遠程虛擬機進程中的類裝載、記憶體、垃圾收集、JIT 編碼等運行數據。

 jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

參數 interval 和 count 代表查詢間隔和次數,如果省略這兩個參數,說明只查詢一次。

選項 作用
-class 監視類裝載、卸載數量、總空間以及類裝載所耗費的時間
-compiler 輸出 JIT 編譯過的方法、耗時等資訊
-printcompilation 輸出已經被 JIT 編譯的方法
-gc 監視 Java 堆狀況
-gccapacity 監視 Java 堆狀況,關注堆各個區域使用到的最大、最小空間
-gcutil 監視 Java 堆狀況,關注已使用空間佔總空間的比例
-gccause 與 gcutil 功能一樣,額外輸出導致上一次 GC 產生的原因
-gcnew 監視新生代 GC 狀況
-gcnewcapacity 監視堆新生代 GC 狀況,關注使用到的最大、最小空間
-gcold 監視老年代 GC 狀況
-gcoldcapacity 監視老年代 GC 狀況,關注使用到的最大、最小空間
-gcmetacapacity 輸出元空間使用到的最大、最小空間

tips: 監控指標的含義,不是本文的重點,可在具體使用到的時候再去查詢。

jinfo

Configuration Info for Java,實時的查看和調整虛擬機的各項參數。

jinfo [option] <pid>
選項 作用
-flag <name> 查看虛擬機進程某個配置項的值
-flag [+/-]<name> 開啟/關閉虛擬機進程某個配置項
-flag <name>=<value> 動態設置虛擬機進程某個配置項
-flags 列印虛擬機進程非默認的配置項以及用戶啟動時設置的虛擬機參數
-sysprops 列印虛擬機進程的 System.getProperties() 的內容

jmap

Memory Map for Java,生成虛擬機的記憶體存儲快照(heapdump 文件或 dump 文件),查詢 finalize 執行隊列、Java 堆等資訊。

jmap [option] <pid>
選項 作用
-dump:<dump-options> 生成 Java 堆存儲快照。格式為:-dump[:live,]format=b,file=<filename> <pid> 。其中 live 參數說明只 dump 出存活的對象
-finalizerinfo 顯示在 F-Queue 中等待 Finalize 執行緒執行 finalize 方法的對象
-heap 顯示 Java 堆詳細資訊
-histo 顯示堆中對象統計資訊,包括類、實例變數、合計容量
-F 當虛擬機進程對 -dump 選項沒有響應時,可使用這個選項強制生成 dump 快照


那麼問題來了,有了 dump 文件後,我們該怎麼對 dump 文件進行解讀呢?這裡推薦個人一直在使用的網站:https://console.perfma.com/,只要將生成的 dump 文件上傳到網站上,就能得到分析結果。(目測原理是 jhat 命令 —— 虛擬機堆轉儲快照分析工具)

tips: 除了使用 jmap 命令,還可以使用 -XX:+HeapDumpOnOutOfMemoryError 參數,讓虛擬機在 OOM 異常出現之後自動生成 dump 文件。

jstack

Stack Trace for Java,用於生成虛擬機當前時刻的執行緒快照(一般稱為 threaddump 或者 javadoc 文件)。執行緒快照就是當前虛擬機內每一條執行緒正在執行的方法堆棧的集合,生成執行緒快照的主要目的是定位執行緒出現長時間停頓的原因,如執行緒間死鎖、死循環、請求外部資源導致的長時間等待等都是導致執行緒長時間停頓的常見原因。

jstack [option] <pid>
選項 作用
-F 當正常輸出的請求不被響應時,強制輸出執行緒堆棧
-m 如果調用本地方法(native)的話,可以顯示 C/C++ 堆棧資訊
-l 除堆棧外,顯示關於鎖的附加資訊


堆棧的分析也可以上傳到 https://console.perfma.com/ 查看分析結果,需要注意的是 dump 文件中的執行緒號是以 16 進位表示的,所以我們定位執行緒的時候,也要把執行緒號轉化為 16 進程。

tips: 給一個系統定位問題的時候,知識、經驗是關鍵基礎,數據是依據,工具是運用知識處理數據的手段。