線程堆棧分析是 Java EE 產品支援工程師必備的核心技能。在堆棧資訊中蘊含的診斷線索,往往遠超開發者的想像。本系列文章將系統梳理 JVM 線程堆棧的核心知識體系,助你快速定位生產環境疑難雜症。
在過去十多年的 JVM 深度分析實戰中,我積累了大量跨版本、跨廠商(Sun HotSpot、IBM JRE、Oracle JRockit)的通用問題模板。無論是線程競爭、死鎖、I/O 卡死、GC/OutOfMemoryError,還是死循環導致的 CPU 飆高,堆棧快照都能提供 90% 以上的關鍵證據。
學習過程中遇到疑惑?可透過以下管道尋求協助:
若願意分享生產環境堆棧現場,我將優先協助分析——實戰才是技能提升的最佳途徑。
Java 虛擬機是 Java EE 平台的基石,為中介軟體與應用程式提供:
JVM 可部署於 Solaris、AIX、Windows 等多種作業系統,單台物理/虛擬伺服器可運行多個 JVM 進程。
標準 Java EE 應用中,線程分配主要由中介軟體核心與 JVM 協作完成(雖然應用也可直接呼叫 API 建立線程,但需謹慎)。部分線程(如 GC 線程)由 JVM 內部管理。理解這一機制,有助於從堆棧追蹤中識別線程池差異、快速判斷請求類型。
線程堆棧是某一時間點的快照,包含所有已建立 Java 線程的完整清單。每個線程提供:
daemon prio=3,中介軟體常以守護線程模式建立tid=0x000000011e52a800,對應 java.lang.Thread.getId()nid=0x251c,關鍵關聯作業系統層面的 CPU 佔用分析waiting for monitor entry [0xfffffffea5afb000] java.lang.Thread.State: BLOCKED (on object monitor)Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.0-b11 mixed mode):
全域唯一標識:Full thread dump 為堆棧快照起始標記(UNIX 下以 kill -3 <PID> 觸發)。
此區塊佔據分析時間最長。以 WebLogic 9.2+ 為例,採用自調優線程池 weblogic.kernel.Default (self-tuning):
"[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)
"GC task thread#0 (ParallelGC)",其 nid 可關聯 OS 層面 CPU 分析JNI global references: 1925
防止 Native 代碼仍在使用的物件被 GC 回收。若應用直接使用 JNI 或第三方庫,需警惕 Native 記憶體洩漏。
Heap PSYoungGen total 466944K, used 178734K [...] PSOldGen total 1400832K, used 1400831K [...] 99% used PSPermGen total 262144K, used 248475K [...] 94% used
同一快照同時提供線程堆棧與堆記憶體資訊,極大提升 GC 相關問題診斷效率。上例中 OldGen 達 99%,顯示記憶體壓力極大。
後續文章將深入講解各廠商堆棧格式差異、進階分析技巧與實戰案例。敬請持續關注。