jstack
是 Java 提供的一个命令行工具,用于生成 Java 进程的线程堆栈跟踪。这对于诊断多线程问题和性能调优非常有用。要使用 jstack
,请按照以下步骤操作:
打开命令行或终端。
首先,找到要获取线程堆栈跟踪的 Java 进程的进程 ID(PID)。您可以使用 jps
命令列出所有 Java 进程及其 PID。例如:
jps
这将显示类似于以下内容的输出:
12345 Main
67890 Jps
在这个例子中,主进程的 PID 是 12345。
jstack
命令生成线程堆栈跟踪。将 <PID>
替换为您在上一步中找到的进程 ID:jstack <PID>
例如:
jstack 12345
这将输出 Java 进程的线程堆栈跟踪。输出将类似于以下内容:
2021-06-21 10:00:00
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=0x00007f123400 nid=0x1a93 waiting on condition [0x00007f1233f0000]
java.lang.Thread.State: BLOCKED (on object monitor)
at Main.method1(Main.java:10)
- waiting to lock <0x00000000d60d8d80> (a java.lang.Object), which is held by thread "Thread-0"
at Main.lambda$main$0(Main.java:5)
at Main$$Lambda$1/691919126.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
"Thread-0" #12 prio=5 os_prio=0 tid=0x00007f123508000 nid=0x1a9b waiting on condition [0x00007f1235f0000]
java.lang.Thread.State: BLOCKED (on object monitor)
at Main.method2(Main.java:15)
- waiting to lock <0x00000000d60d8d80> (a java.lang.Object), which is held by thread "main"
at Main.lambda$main$1(Main.java:5)
at Main$$Lambda$2/1919696866.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
在这个例子中,您可以看到两个线程都在等待锁,该锁由另一个线程持有。这有助于诊断死锁或其他多线程问题。
请注意,jstack
命令可能需要管理员权限才能运行。如果您遇到权限问题,请尝试使用 sudo
(在 Linux 或 macOS 上)或以管理员身份运行命令提示符(在 Windows 上)。