jstack 工具
636 字大约 2 分钟2024年12月3日
jstack
工具,它是用来生成 Java 线程栈跟踪的一个工具。通过它,你可以了解当前 Java 应用程序的线程状态,从而帮助你诊断性能问题或线程死锁等问题。
在使用 jstack
之前,你需要知道目标 Java 进程的 PID(进程 ID)。可以通过 jps
命令来查看当前运行的 Java 进程及其 PID。然后,你可以使用 jstack
命令来生成线程栈跟踪。
基本命令格式如下:
jstack <pid>
例如,如果你想生成 PID 为 12345 的 Java 进程的线程栈跟踪,命令如下:
jstack 12345
执行上述命令后,jstack
会输出当前 Java 进程的所有线程的栈跟踪信息。
输出示例及字段解释
以下是一个典型的 jstack
输出示例:
2024-12-03 17:50:17
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.181-b13 mixed mode):
"main" #1 prio=5 os_prio=0 tid=0x000000000276c000 nid=0x1f84 waiting on condition [0x0000000002bfe000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000d5cd8f18> (a java.util.concurrent.CountDownLatch$Sync)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)
at com.example.MyClass.main(MyClass.java:15)
...
输出示例中的每个字段的含义如下:
- Thread Name ("main"): 表示线程的名称,在这里是 "main"。
- Thread ID (#1): JVM 内部的线程 ID。
- Priority (prio=5): 线程的优先级。
- OS Priority (os_prio=0): 操作系统的线程优先级。
- Thread Identifier (tid=0x000000000276c000): 线程的标识符。
- Native ID (nid=0x1f84): 线程在操作系统中的原生 ID。
- Thread State: 线程当前的状态,在这里是 WAITING (parking),表示线程正在等待某个条件。
- Stack Trace: 线程的栈跟踪,显示了线程执行的每一行代码。