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

Java Thread Dump 實戰:CPU 高佔用與線程死鎖定位標準流程

     編輯:Java 相關知識

Thread Dump 是排查 JVM 性能問題的「X 光片」。本文規範獲取、轉換、分析全流程,聚焦高 CPU 與死鎖兩大高頻場景。

一、 標準獲取流程

  1. 定位 PID:ps aux | grep java | grep -v grep 或 jps -l。
  2. 觸發 Dump:
    • Linux/Unix:kill -3 <PID>(輸出到 stdout/控制台/日志文件)。
    • Windows:jstack -l <PID> > threaddump.txt。
    • 程序化:Thread.getAllStackTraces() 寫入文件。
  3. 多次採樣:間隔 10-30 秒連續 3-5 次,觀察線程狀態變化。

二、 關鍵信息解讀

"http-nio-8080-exec-10" #27 daemon prio=5 os_prio=0 tid=0x00007f... nid=0x1234 runnable [0x00007f...]
   java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
    - locked <0x000000076abcd123> (a org.apache.tomcat.util.net.NioChannel)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
  • nid:系統線程 ID(十六進制),對應 top -H -p <PID> 中的 PID 列(十進制需轉換)。
  • Thread State:RUNNABLE(佔 CPU)、BLOCKED(等鎖)、WAITING/TIMED_WAITING(等待)、TERMINATED。
  • locked:持有的監視器鎖對象地址。
  • waiting on:等待的監視器鎖對象地址。

三、 高 CPU 定位三步法

  1. top -H -p <PID> 找佔 CPU 前幾的線程 PID(十進制)。
  2. 轉十六進制:printf "%x\n" <PID> 得到 nid。
  3. 在 Dump 中搜索該 nid,查看堆疊定位熱點代碼行。

四、 死鎖自動識別與手動分析

  • JDK 自帶死鎖檢測:Dump 末尾會有 Found one Java-level deadlock 區塊,列出互相等待的線程與鎖。
  • 手動分析:找狀態為 BLOCKED 且 waiting on 指向同一鎖地址的線程組,構建等待圖,找環。
  • 常見模式:多業務共用鎖順序不一致 → 強制全局鎖順序;長事務持鎖 → 縮小同步塊/用非阻塞算法。

五、 進階工具輔助

  • fastThread:在線分析網站,上傳 Dump 自動生成報告。
  • Thread Dump Analyzer (TDA):Swing 圖形工具,支援歷史對比。
  • Arthas:阿里開源 Java 診斷神器,thread -b 直接顯示阻塞鏈。

六、 總結

Thread Dump 分析核心是「PID→nid→堆疊→代碼」。建立標準化排查單,配合 top/jstack/Arthas,將定位時間從小時級壓縮到分鐘級。

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