好的,我来帮你系统整理一下 Java 命令 jstack
的作用、原理和使用方法,并给出典型示例。
Java jstack
工具详解
1️⃣ 工具简介
jstack
是 JDK 自带的一个命令行工具,用于 打印 Java 进程的线程堆栈信息。- 主要作用:
- 诊断 死锁(Deadlock)
- 分析 线程阻塞(Blocked/Waiting)
- 查看 线程状态和调用栈
注意:
jstack
只能用于 Java 进程(JVM),不能用于普通的操作系统进程。
2️⃣ 基本语法
jstack [option] <pid>
pid
:Java 进程的进程号- 常用选项:选项说明
-l
打印线程锁信息(锁和 Monitor)-F
强制打印线程堆栈(用于被阻塞或无法响应的进程)-m
显示本地方法栈信息(Native 方法)
3️⃣ 获取 Java 进程 PID
方法 1:使用 jps
jps -l
输出示例:
12345 MyApplication
67890 Jps
12345
就是 Java 进程 PID
方法 2:使用 ps
(Linux)
ps -ef | grep java
4️⃣ 使用示例
示例 1:打印线程堆栈
jstack 12345
输出示例:
"main" #1 prio=5 os_prio=0 tid=0x00007f8b9c00b800 nid=0x1 waiting on condition [0x00007f8b9b3ff000]
java.lang.Thread.State: RUNNABLE
at com.example.MyClass.myMethod(MyClass.java:10)
at com.example.MyClass.main(MyClass.java:5)
...
- 可以看到:
- 线程名称
"main"
- 线程 ID
#1
- 线程状态
RUNNABLE、WAITING、BLOCKED
- 调用栈 显示当前执行方法
- 线程名称
示例 2:打印线程锁信息
jstack -l 12345
- 输出中会显示:
Locked ownable synchronizers
Waiting to lock
的对象- 方便定位 死锁 和 线程阻塞
示例 3:强制打印线程堆栈
jstack -F 12345
- 当进程无法响应或被挂起时使用
- 可能导致 JVM 响应短暂暂停,但能获取线程信息
5️⃣ 典型应用场景
- 排查死锁
- 线程互相持有锁导致阻塞
- 查看线程状态和锁信息
- 分析线程阻塞/性能瓶颈
- BLOCKED / WAITING 线程
- 定位长时间占用资源的线程
- 结合线程 dump 工具
- 使用
jstack
输出文件:jstack 12345 > threaddump.log
- 可使用 IDEA 或 Thread Dump Analyzer 分析
- 使用
6️⃣ 注意事项
- 需要 JVM 权限:执行
jstack
的用户必须有权限访问目标进程。 - 生产环境谨慎使用:大量线程 dump 或频繁使用
-F
可能影响性能。 - 线程状态参考:状态含义RUNNABLE正在运行或可运行BLOCKED等待锁定资源WAITING无限期等待通知TIMED_WAITING等待指定时间TERMINATED已结束
✅ 总结:
jstack
= 线程堆栈分析工具- 主要用途:死锁排查、线程阻塞分析、性能调优
- 核心操作:
- 获取 PID
- 执行
jstack [-l|-F] <pid>
- 分析线程状态和锁信息
发表回复