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 等工具。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)