生產環境往往無法部署重型 GUI 分析器(JConsole、VisualVM)。JDK 內建的 5 大命令列工具輕量、聚焦、無依賴,是線上故障排查的利器。本文實戰演示如何組合使用它們完成進程識別、GC 監控、執行緒轉儲、堆快照與深度分析。
列出本機所有 Java 進程的 VMID(非 OS PID)與啟動命令列:
C:\> jps
5756 SwingSet2
5892 Jps
VMID 是後續工具的核心參數。若 `jps` 看不到進程,不代表無法附著,僅表示未宣佈可用性。
支援多種 `
jstat -options
-class -compiler -gc -gccapacity -gccause -gcnew -gcnewcapacity
-gcold -gcoldcapacity -gcpermcapacity -gcutil -printcompilation
定期採樣語法:`jstat -gc
jstat -gc 5756 250 10 # 每 250ms 採樣一次,共 10 次
輸出欄位詳見 Javadoc。`-class` 可偵測 ClassLoader 洩漏,`-printcompilation` 觀察 JIT 編譯行為。
相當於 `Ctrl+Break`,輸出所有 Java 執行緒堆疊,含鎖資訊(`-l` 參數):
jstack -l 5756 > threaddump.txt
核心用途:死鎖定位、活鎖分析、CPU 飆高時定位熱點執行緒、非 Java 執行緒(VM 內部)檢視。
缺乏週期性採樣參數,可寫 Shell 腳本循環調用。
啟動 HTTP 伺服器瀏覽二進制堆轉儲:
jhat -port 7000 heap.bin
# 瀏覽器開啟 https://localhost:7000
OQL 查詢語言:類 SQL 語法針對堆物件查詢:
select s from java.lang.String s where s.count >= 100
select referrers(f) from java.io.File f
結果為物件鏈結,可遞迴追蹤引用鏈。內建 `referrers()`、`regex()` 等查詢函數。
五大工具各司其職,`jstat`/`jmap` 為切入點,`jstack` 解決併發問題,`jhat` 完成深度堆剖析。它們與 JConsole/VisualVM 互補:GUI 提供總覽,命令列提供精準切片。熟練掌握這組「瑞士刀」,線上故障排查不再手足無措。