首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JDK 內建命令列分析工具實戰:jps、jstat、jstack、jmap、jhat 精準診斷 Java 進程

     編輯:Java 相關知識

生產環境往往無法部署重型 GUI 分析器(JConsole、VisualVM)。JDK 內建的 5 大命令列工具輕量、聚焦、無依賴,是線上故障排查的利器。本文實戰演示如何組合使用它們完成進程識別、GC 監控、執行緒轉儲、堆快照與深度分析。

前置準備

  • 啟用 JMX:`-Dcom.sun.management.jmxremote`(部分工具需要)
  • 工具位於 JDK `bin/`,本質為 Java 類薄封裝,可在程式中直接呼叫 `main()`
  • 以 SwingSet2 Demo 為例演示

1. jps (sun.tools.jps) — 進程發現器

列出本機所有 Java 進程的 VMID(非 OS PID)與啟動命令列:

C:\> jps
5756 SwingSet2
5892 Jps

VMID 是後續工具的核心參數。若 `jps` 看不到進程,不代表無法附著,僅表示未宣佈可用性。

2. jstat (sun.tools.jstat) — 統計採樣器

支援多種 `

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 編譯行為。

3. jstack (sun.tools.jstack) — 執行緒轉儲器

相當於 `Ctrl+Break`,輸出所有 Java 執行緒堆疊,含鎖資訊(`-l` 參數):

jstack -l 5756 > threaddump.txt

核心用途:死鎖定位、活鎖分析、CPU 飆高時定位熱點執行緒、非 Java 執行緒(VM 內部)檢視。

4. jmap (sun.tools.jmap) — 堆快照器

  • 二進制堆轉儲:`jmap -dump:format=b,file=heap.bin 5756`(配合 jhat 分析)
  • 直方圖快速概覽:`jmap -histo 5756` 輸出類別實例數、佔用位元組、類名,支援初步洩漏判斷

缺乏週期性採樣參數,可寫 Shell 腳本循環調用。

5. jhat (com.sun.tools.hat.Main) — 堆分析伺服器

啟動 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()` 等查詢函數。

組合拳實戰流程

  1. `jps` 確認目標 VMID
  2. `jstat -gcutil` 觀察 GC 頻率/年齡分佈
  3. 異常時 `jstack -l` 捕獲執行緒狀態
  4. 懷疑洩漏 `jmap -histo` 快速定位可疑類別
  5. `jmap -dump` 完整堆轉儲 → `jhat + OQL` 深度根因分析

結語

五大工具各司其職,`jstat`/`jmap` 為切入點,`jstack` 解決併發問題,`jhat` 完成深度堆剖析。它們與 JConsole/VisualVM 互補:GUI 提供總覽,命令列提供精準切片。熟練掌握這組「瑞士刀」,線上故障排查不再手足無措。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved