jstack
是一個 Java 命令行工具,用于生成 Java 進程的線程堆棧跟蹤。這對于診斷多線程問題和性能分析非常有用。要執行 jstack
命令,請按照以下步驟操作:
打開命令行界面(在 Windows 上是 CMD 或 PowerShell,在 macOS 和 Linux 上是 Terminal)。
首先,找到要生成線程堆棧跟蹤的 Java 進程的進程 ID(PID)。您可以使用 jps
命令來查找所有 Java 進程及其 PID。例如:
jps
這將顯示類似于以下內容的輸出:
12345 Main
67890 Jps
在這個例子中,主 Java 進程的 PID 是 12345。
jstack
命令生成線程堆棧跟蹤。將 <PID>
替換為您在上一步中找到的 Java 進程的 PID:jstack <PID>
例如:
jstack 12345
這將輸出 Java 進程的線程堆棧跟蹤,類似于以下內容:
2021-06-21 14:45:30
Full thread dump Java HotSpot(TM) 64-Bit Server VM (11.0.11+9-Ubuntu-0ubuntu2.20.04) (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing):
"main" #11 prio=5 os_prio=0 tid=0x00007f3c00000000 nid=0x1a93 waiting on condition [0x00007f3c02800000]
java.lang.Thread.State: BLOCKED (on object monitor)
at Main.method1(Main.java:10)
- waiting to lock <0x00000000d600d868> (a java.lang.Object), which is held by thread "Thread-0"
at Main.lambda$main$0(Main.java:5)
at Main$$Lambda$1/651819126.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
"Thread-0" #12 prio=5 os_prio=0 tid=0x00007f3c0001b000 nid=0x1a94 waiting on condition [0x00007f3c02900000]
java.lang.Thread.State: BLOCKED (on object monitor)
at Main.method2(Main.java:15)
- waiting to lock <0x00000000d600d868> (a java.lang.Object), which is held by thread "main"
at Main.lambda$main$1(Main.java:5)
at Main$$Lambda$2/195919126.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
請注意,jstack
命令可能需要管理員權限才能運行。如果在執行過程中遇到權限問題,請嘗試使用 sudo
(在 Linux 和 macOS 上)或以管理員身份運行命令提示符(在 Windows 上)。