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

Java 線程轉儲(Thread Dump)獲取七大方法全攻略:從 jstack 到 APM 工具

     編輯:Java 相關知識

為什麼需要 Thread Dump?

Thread Dump 是 JVM 當前所有線程堆棧的快照,是排查 CPU 飆高、死鎖、內存洩漏、響應變慢、線程飢餓 等問題的「核磁共振」。掌握多種獲取方式,應對不同環境限制(無 JDK、無權限、容器化、Windows 等)。

方法對比速查表

方法適用場景優點缺點
jstack有 JDK、本地/遠程進程官方標準、輕量、可腳本化需 JDK、進程同用戶
kill -3僅 JRE、Linux/Unix無需 JDK、容器友好輸出到 stdout、難重定向
jvisualvm桌面開發、可視化分析GUI 直觀、支持遠程、含概覽需圖形界面、啟動慢
JMC (Flight Recorder)生產環境持續分析低開銷、歷史回溯、事件豐富需商業授權(舊版)、學習曲線
Ctrl+BreakWindows 控制台程序無工具、即時輸出到控制台、難保存
ThreadMXBean應用內嵌、程序化導出無外部依賴、可集成監控端點需修改代碼、重新部署
APM 工具全鏈路監控體系一鍵獲取、關聯調用鏈、告警聯動需部署探針、成本高

1. jstack - 標準首選

# 基礎用法
jstack -l  > threadDump.txt
# -l: 長列表,包含鎖信息 (java.util.concurrent locks)

# 容器內獲取 (Docker)
docker exec  jstack -l 1 > /tmp/dump.txt

# 遠程獲取 (需同用戶、同網絡)
jstack -l @ > dump.txt

注意:JDK 5+ 內置。若進程掛起無響應,加 -F 強制 (僅限 Linux/Solaris)。

2. kill -3 - 僅有 JRE 時的救星

kill -3 
# 輸出導向:進程 stdout (如 Tomcat 為 catalina.out)
# 容器中: kubectl exec  -- kill -3 1

輸出格式與 jstack 一致,但混雜在應用日誌中,需提取。

3. jvisualvm / JMC - 可視化分析利器

  • jvisualvm:JDK_HOME/bin/jvisualvm.exe,雙擊進程 →「線程 Dump」按鈕,支持保存文件、篩選、死鎖檢測
  • JMC (Java Mission Control):JDK_HOME/bin/jmc.exe,啟動 Flight Recorder → 設置 Dump 間隔 (如 60s) → Threads 面板查看歷史快照

4. Windows Ctrl+Break - 控制台快捷鍵

  • 聚焦控制台窗口 → Ctrl+Break
  • 筆記本無 Break 鍵:嘗試 Fn+B 或查閱廠商映射
  • 重定向保存:java MyApp > dump.txt 2>&1 後再觸發

5. ThreadMXBean - 代碼級集成

public void dumpThreadDump() {
    ThreadMXBean mx = ManagementFactory.getThreadMXBean();
    for (ThreadInfo ti : mx.dumpAllThreads(true, true)) { // locked monitors, locked synchronizers
        System.out.println(ti);
    }
}
// 暴露為 HTTP 端點 (Spring Boot Actuator /management/threaddump)

優勢:無外部工具、可集成到運行時管理後台、支持定時自動導出。

6. APM 工具 (以 AppDynamics 為例)

  1. 配置界面 → Diagnostics → Take a thread dump
  2. 設置:動作名、抓取次數、間隔(ms)
  3. 可選:執行前需審批、通知郵箱
  4. 一鍵觸發,結果關聯業務事務、調用鏈、慢 SQL

生產環境最佳實踐

  1. 連續抓取 3 次,間隔 10-20s:單次快照無法判斷線程是否卡住,連續對比才能確認「運行中」還是「死鎖/阻塞」
  2. 保存原始文本:便於 fastthread.io、thread-analyzer 等在線工具上傳分析
  3. 關聯業務日誌:Dump 時間點前後的應用日誌、GC 日誌、監控指標
  4. 容器化環境:優先 jstack (側車容器) 或 kill -3 (kubectl exec),避免進入容器交互

常見分析模式

  • BLOCKED:尋找持有鎖的線程 (狀態 RUNNABLE 且持有目標鎖)
  • WAITING (parking):線程池空閒、Condition.await、CountDownLatch
  • RUNNABLE 高 CPU:核對代碼行號,排查死循環、正則回溯、頻繁 GC
  • 死鎖檢測:jstack -l 末尾自動報告 "Found one Java-level deadlock"

總結

七大方法中,jstack 與 kill -3 覆蓋 95% 場景,建議作為標準 SOP 納入故障應急手冊。可視化工具適合深度分析,程序化接口適合自動化運維,APM 適合全鏈路關聯。無論哪種方式,連續多次抓取、保存原始文本、關聯上下文 是高效定位問題的鐵律。

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