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 | 輸出元空間使用到的最大、最小空間 |

監控名額的含義,不是本文的重點,可在具體使用到的時候再去查詢。
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 指令 —— 虛拟機堆轉儲快照分析工具)
除了使用 jmap 指令,還可以使用 -XX:+HeapDumpOnOutOfMemoryError 參數,讓虛拟機在 OOM 異常出現之後自動生成 dump 檔案。
jstack
Stack Trace for Java,用于生成虛拟機目前時刻的線程快照(一般稱為 threaddump 或者 javadoc 檔案)。線程快照就是目前虛拟機内每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導緻的長時間等待等都是導緻線程長時間停頓的常見原因。
jstack [option] <pid>
當正常輸出的請求不被響應時,強制輸出線程堆棧 | |
如果調用本地方法(native)的話,可以顯示 C/C++ 堆棧資訊 | |
除堆棧外,顯示關于鎖的附加資訊 |
堆棧的分析也可以上傳到 https://console.perfma.com/ 檢視分析結果,需要注意的是 dump 檔案中的線程号是以 16 進制表示的,是以我們定位線程的時候,也要把線程号轉化為 16 進制。
給一個系統定位問題的時候,知識、經驗是關鍵基礎,資料是依據,工具是運用知識處理資料的手段。