如何查看java死锁
查看 Java 死锁的方法
使用 jstack 工具
jstack 是 JDK 自带的命令行工具,可以生成 Java 进程的线程转储信息。通过分析线程转储,可以识别死锁。
运行命令:
jstack <pid>
其中 <pid> 是 Java 进程的 ID。可以在输出中搜索 deadlock 关键词,jstack 会自动标记死锁的线程和锁资源。
使用 VisualVM
VisualVM 是一个图形化工具,可以监控和分析 Java 应用程序。安装后,连接到目标 Java 进程,切换到“线程”标签页。如果存在死锁,VisualVM 会直接显示死锁信息。
使用 JConsole
JConsole 是另一个 JDK 自带的图形化工具。连接到目标进程后,切换到“线程”标签页,点击“检测死锁”按钮,工具会列出死锁的线程和锁。
编程方式检测
通过 ThreadMXBean 可以编程检测死锁:
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
long[] threadIds = threadMXBean.findDeadlockedThreads();
if (threadIds != null) {
ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(threadIds);
for (ThreadInfo threadInfo : threadInfos) {
System.out.println(threadInfo.getThreadName() + " is deadlocked.");
}
}
分析线程转储
手动分析线程转储时,关注以下信息:
- 线程状态为
BLOCKED - 线程持有的锁和等待的锁形成循环依赖
例如:
Thread-1: waiting to lock 0x000000076ab95d10, held by Thread-2 Thread-2: waiting to lock 0x000000076ab95d50, held by Thread-1
使用 Arthas
Arthas 是阿里开源的 Java 诊断工具,提供 thread -b 命令直接检测死锁:

thread -b
注意:以上方法适用于大多数情况,但某些复杂的死锁可能需要结合多种工具分析。在生产环境中建议定期监控,避免死锁长时间存在。






