jstack 是 Java 开发工具包(JDK)中的一个命令行工具,用于生成 Java 虚拟机(JVM)进程的线程转储(thread dump)。线程转储包含了 JVM 中所有线程的当前状态信息,常用于诊断死锁、线程阻塞、CPU 占用过高等问题。
1. 基本用法
jstack [options] <pid>
<pid>:目标 Java 进程的进程 ID(Process ID)。[options]:可选参数。
2. 常用选项
-F:强制生成线程转储。如果jstack无法正常响应,可以使用此选项强制生成。-l:除了线程堆栈信息外,还会显示关于锁的附加信息(如持有的锁、等待的锁等)。-m:混合模式。除了 Java 堆栈帧外,还会显示本地方法(C/C++)的堆栈帧。-h或-help:显示帮助信息。
3. 输出内容
jstack 输出的线程转储通常包含以下信息:
- 线程名称:线程的名称。
- 线程 ID:线程的唯一标识符。
- 线程状态:线程的当前状态(如
RUNNABLE、WAITING、BLOCKED等)。 - 调用堆栈:线程的调用堆栈,显示线程当前执行的方法及其调用链。
- 锁信息(如果使用
-l选项):线程持有的锁和等待的锁。
4. 示例
jstack 系统进程ID | grep 16进制线程ID 命令找到对应的线程信息
5. 使用场景
- 诊断死锁:通过分析线程转储,可以查看哪些线程在等待锁,从而判断是否存在死锁。
- 分析 CPU 占用过高:通过查看线程状态和调用堆栈,可以定位占用 CPU 资源的线程。
- 排查线程阻塞:通过查看线程状态和锁信息,可以分析线程为何被阻塞。
6. 注意事项
jstack需要与目标 JVM 进程运行在相同的用户权限下,否则可能会失败。- 如果 JVM 进程没有响应,可以使用
-F选项强制生成线程转储。 jstack只能用于 HotSpot JVM,其他 JVM 实现(如 IBM J9)可能需要使用不同的工具。
7. 结合其他工具
jps:用于列出当前系统中的 Java 进程及其 PID,方便找到目标进程。top或htop:用于查看系统资源占用情况,结合jstack可以更高效地定位问题。
通过 jstack,开发者可以深入了解 JVM 中线程的运行状态,从而快速定位和解决多线程相关的问题。
8. 真实案例参考
developer.jdcloud.com/article/313… jmap 命令详解 jstack命令详解 Linux top 命令