好的,我来帮你系统整理一下 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️⃣ 典型应用场景

  1. 排查死锁
    • 线程互相持有锁导致阻塞
    • 查看线程状态和锁信息
  2. 分析线程阻塞/性能瓶颈
    • BLOCKED / WAITING 线程
    • 定位长时间占用资源的线程
  3. 结合线程 dump 工具
    • 使用 jstack 输出文件:jstack 12345 > threaddump.log
    • 可使用 IDEA 或 Thread Dump Analyzer 分析

6️⃣ 注意事项

  • 需要 JVM 权限:执行 jstack 的用户必须有权限访问目标进程。
  • 生产环境谨慎使用:大量线程 dump 或频繁使用 -F 可能影响性能。
  • 线程状态参考:状态含义RUNNABLE正在运行或可运行BLOCKED等待锁定资源WAITING无限期等待通知TIMED_WAITING等待指定时间TERMINATED已结束

✅ 总结:

  • jstack = 线程堆栈分析工具
  • 主要用途:死锁排查、线程阻塞分析、性能调优
  • 核心操作:
    1. 获取 PID
    2. 执行 jstack [-l|-F] <pid>
    3. 分析线程状态和锁信息