0

0

怎么排查Java中的线程死锁_jstack命令导出堆栈与死锁自动检测分析

P粉602998670

P粉602998670

发布时间:2026-03-17 10:38:31

|

636人浏览过

|

来源于php中文网

原创

用 jstack -l <pid> 可快速发现死锁,输出末尾显示“Found 1 deadlock.”即确认;它会列出锁持有者与等待者地址,匹配locked <0x...>和waiting to lock <0x...>即可定位。

怎么排查java中的线程死锁_jstack命令导出堆栈与死锁自动检测分析

怎么用 jstack 快速发现死锁

直接运行 jstack -l <pid>,加上 -l 参数是关键——它会显式列出锁持有者和等待者,没有这个参数,jstack 默认不输出死锁相关线索,容易漏掉问题。

常见错误现象:只跑 jstack <pid>,看到一堆 WAITING 线程就以为是卡顿,其实根本没触发死锁检测逻辑;或者导出文本后手动 grep “deadlock”,结果一无所获。

  • jstack -l <pid> 输出末尾如果有 “Found 1 deadlock.” 就是实锤,不用再猜
  • 如果 JVM 是 8u60+,jstack -l 还会标出每个线程持有的 java.util.concurrent.locks.ReentrantLocksynchronized 锁,区分得很清楚
  • 线上环境别反复执行 jstack -l,它会触发全局 safepoint,短时间高频调用可能加重 STW 延迟

死锁堆栈里怎么看谁锁了谁

重点盯住 java.lang.Thread.State: BLOCKED (on object monitor)Locked ownable synchronizers: 这两块。前者告诉你线程在等哪个对象监视器,后者告诉你它自己正拿着哪些锁。

使用场景:两个线程互相等待对方释放锁,比如线程 A 持有 lockAlockB,线程 B 持有 lockBlockA。这时候 jstack -l 会把双方的 waiting to lock <0x...>locked <0x...> 地址列出来,地址一致就对上了。

立即学习Java免费学习笔记(深入)”;

  • 注意看 locked <0x0000000712345678>waiting to lock <0x0000000712345678> 的十六进制地址是否匹配
  • java.util.concurrent.locks.ReentrantLock$NonfairSync 类型的锁,要看 locked ownable synchronizers 下的 owner thread 字段,不是看 monitor
  • 如果看到 parking to wait for <0x...>,那是 Unsafe.park(),属于 AQS 队列阻塞,不等于死锁,别误判

为什么 jstack 有时找不到死锁

不是所有“卡住”都是死锁。jstack -l 只能检测到 **循环等待且全部线程都处于 BLOCKED 或 WAITING(并明确指向同一把锁)** 的经典死锁。其他情况它不报。

AI改图神器
AI改图神器

AI万能图片编辑器,一键抠图,去水印,智能图片美化,照片转漫画,照片变活转视频,图片无损放大,一键背景虚化,位图智能转矢量图

下载

性能 / 兼容性影响:JDK 6 和 7 的 jstack -lReentrantLock 支持弱,可能只显示 AbstractOwnableSynchronizer,看不出具体锁实例;JDK 8u60 后才稳定输出 owner thread ID。

  • 线程在 I/O、Thread.sleep()Object.wait()(无竞争)中挂起 → 不是死锁,jstack 不报
  • 三方库用了 LockSupport.park() 自定义同步,没走 JVM 锁机制 → jstack -l 看不到锁关系
  • 分布式锁、数据库行锁、文件锁这类外部资源争用 → jstack 根本不感知

自动检测死锁的靠谱做法

别依赖人工翻日志。JVM 自带的 ThreadMXBean.findDeadlockedThreads() 是唯一可靠入口,所有监控工具(如 Prometheus + JMX Exporter、Arthas)底层都调它。

可给出简短示例:

ThreadMXBean bean = ManagementFactory.getThreadMXBean();
long[] ids = bean.findDeadlockedThreads(); // 返回 null 表示没死锁
if (ids != null) {
    ThreadInfo[] infos = bean.getThreadInfo(ids, true, true);
    // 打印 infos 就是 jstack -l 末尾那段
}
  • Arthas 的 thread -b 命令就是封装了这个 API,比手敲 jstack 快,还支持持续 watch
  • Spring Boot Actuator 的 /actuator/threaddump 默认不包含死锁检测,得加配置 management.endpoint.threaddump.show-locks=true
  • 注意 findDeadlockedThreads() 是快照操作,瞬间发生又解开的死锁可能错过,得配合定期轮询或告警触发

死锁真正难的不是发现,是复现和定位锁顺序——jstack 给的是结果快照,但谁先 lockA 再 lockB、谁反过来,得结合代码路径和调用时序推。这点很容易被忽略。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

433

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

252

2023.10.07

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

448

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

606

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

448

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

606

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

786

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

102

2025.12.01

Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建
Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建

本指南详解Nginx在Windows、macOS及Linux系统的安装全流程。涵盖官方包解压、Homebrew一键部署、APT/YUM源配置及Docker容器化方案。无论新手或开发者,均可快速搭建运行环境,掌握跨平台核心指令,为后续配置与调优奠定坚实基础。

10

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.5万人学习

C# 教程
C# 教程

共94课时 | 11.5万人学习

Java 教程
Java 教程

共578课时 | 83.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号