jstack 命令详解
jstack 命令详解
用于生成 Java 虚拟机(JVM)的线程快照(Thread Dump),帮助诊断线程问题(如死锁、高 CPU 占用、线程阻塞等)。
基本语法
jstack [options] <pid>
<pid>:目标 Java 进程的 ID(可通过jps或ps获取)。[options]:可选参数(见下文)。
常用参数
| 参数 | 作用 |
|---|---|
-F |
强制生成线程快照(适用于 JVM 无响应时) |
-m |
显示混合模式(Java 栈 + Native 本地方法栈) |
-l |
输出锁的附加信息(如持有/等待的锁) |
核心用途
-
诊断死锁
jstack 会明确标记Found one Java-level deadlock:,并列出涉及死锁的线程及锁信息。 -
分析高 CPU 问题
- 通过
top找到高 CPU 的线程 ID(十进制)。 - 将线程 ID 转为十六进制。
- 在
jstack输出中搜索该十六进制值,定位线程堆栈。
- 通过
-
线程状态分析
输出中线程状态可能包括:RUNNABLE:执行中。BLOCKED:等待监视器锁。WAITING:无限期等待唤醒。TIMED_WAITING:限时等待。
使用示例
-
生成线程快照
jstack -l 1234 > thread_dump.txt -
结合其他命令定位高 CPU 线程
# 1. 查找 Java 进程 PID jps -l # 输出: 1234 com.example.MyApp # 2. 查看该进程的线程 CPU 使用 top -H -p 1234 # 记录高 CPU 线程的十进制 ID(如 5678) # 3. 转换为十六进制 printf "%x\n" 5678 # 输出: 162e # 4. 在 jstack 结果中搜索 0x162e jstack -l 1234 | grep -A 20 162e
输出解析
jstack 的线程快照结构如下:
"线程名" #序号 状态
java.lang.Thread.State: 状态描述
调用栈信息
Locked/waiting 锁信息(-l 参数启用)
关键信息示例:
"main" #1 prio=5 os_prio=0 tid=0x00007f... nid=0x1dd3 waiting on condition [0x...]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.example.MyApp.run(MyApp.java:10)
- locked <0x000000076ab00000> (a java.lang.Object)
注意事项
- 权限:运行用户需有权限访问目标 JVM 进程。
- JDK 路径:确保
JAVA_HOME/bin在系统 PATH 中。 - 替代工具:
jcmd <pid> Thread.print功能类似。 - 安全性:生产环境谨慎使用,短暂暂停 JVM。
通过合理利用 jstack,可快速定位线程问题,提升故障排查效率。若需动态监控,建议结合 VisualVM 或 Arthas 等工具。
浙公网安备 33010602011771号