線程堆棧是 JVM 給定時刻的快照,**包含所有線程的完整調用鏈**,是排查死鎖、CPU 飆高、卡頓、OOM、GC 問題的「核磁共振」。Java EE 支持工程師必備核心技能。
Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.0-b11 mixed mode):
# 1. Java EE 中間件/應用線程(分析重點)
"[STANDBY] ExecuteThread: '414' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=3 tid=0x000000010916a800 nid=0x2613 in Object.wait() [0xfffffffe9edff000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0xffffffff27d44de0> (a weblogic.work.ExecuteThread)
at java.lang.Object.wait(Object.java:485)
at weblogic.work.ExecuteThread.waitForRequest(ExecuteThread.java:160)
- locked <0xffffffff27d44de0> (a weblogic.work.ExecuteThread)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:181)
# 2. HotSpot VM 內部線程(通常忽略,除非高 CPU)
"VM Periodic Task Thread" prio=3 tid=0x0000000101238800 nid=0x19 waiting on condition
# 3. GC 線程(並行 GC 時多個,關鍵數據)
"GC task thread#0 (ParallelGC)" prio=3 tid=0x0000000100120000 nid=0x3 runnable
"GC task thread#1 (ParallelGC)" prio=3 tid=0x0000000100131000 nid=0x4 runnable
...
# 4. JNI 全局引用計數(檢測本地洩漏)
JNI global references: 1925
# 5. Java 堆內存分解(JDK 6+ 末尾附帶,GC 問題關鍵)
Heap
PSYoungGen total 466944K, used 178734K [...]
PSOldGen total 1400832K, used 1400831K [...] # 99% used!
PSPermGen total 262144K, used 248475K [...]
| 字段 | 含義 | 分析價值 |
|---|---|---|
| 線程名 | 中間件標識,含線程池名、狀態 | 識別業務/系統線程 |
| daemon prio | 守護線程、優先級 | 守護線程不阻止 JVM 退出 |
| tid | Java 線程 ID (Thread.getId()) | 關聯 Java 代碼 |
| nid | 原生線程 ID (OS 級) | 關鍵:關聯 top -H/ps -T 定位高 CPU 線程 |
| Thread.State | RUNNABLE/BLOCKED/WAITING/TIMED_WAITING/TERMINATED | 快速定位阻塞原因 |
| 堆棧跟蹤 | 完整調用鏈 | 90% 根因在這裡 |
BLOCKED,互相持有鎖等待對方鎖,堆棧顯示 waiting on 循環RUNNABLE 線程佔用高 CPU,結合 nid 轉十六進制,top -H -p PID 定位,查看堆棧熱點方法(如正則回溯、大循環、GC)RUNNABLE 但堆棧停在 SocketRead/FileRead/DB queryrunnable 佔用高 CPURUNNABLE 反覆執行同一代碼行,無阻塞jstack -l PID > threaddump.txt(推薦,含鎖信息)kill -3 PID(輸出到 stdout/日志文件)Ctrl+Break(控制台)或 jstackfastthread.io(上傳文件自動生成報告)thread -b 直接看阻塞鏈)、Greys-Anatomytop -H 定位 OS 線程 → 驗證 CPU 佔用線程堆棧分析是「看透 JVM 內心」的核心技能。掌握結構拆解、關鍵字段、問題模板、工具鏈、實戰流程,從「無從下手」進化為「精準定位根因」。持續練習真實案例,積累模式庫,是成為性能調優專家的必經之路。