在Java里并发编程中的死锁如何检测_Java死锁监控与排查方法解析-java教程

Java死锁能被自动检测,但仅限于synchronized内置锁场景;JVM通过ThreadMXBean可检测此类死锁,却无法识别ReentrantLock等显式锁及wait/notify逻辑死锁。

Java死锁能被自动检测吗?能,但仅限于线程持有对象监视器锁(synchronized)的场景

Java 虚拟机本身不主动预防死锁,但在运行时可通过 ThreadMXBean 检测到部分死锁——前提是这些死锁涉及的是内置锁(即 synchronized 块/方法持有的 java.lang.Object 监视器锁)。JVM 无法检测基于 java.util.concurrent.locks.Lock(如 ReentrantLock)的死锁,除非你显式调用其 getHoldCount() 或启用 fairness + 配合外部监控。

常见错误现象:jstack -l 输出中出现 Found 1 deadlock.,但线上服务已卡住数分钟才被发现;或使用 VisualVM 查看线程状态时,多个线程长期处于 BLOCKED 状态,且堆栈显示互相等待对方持有的 monitor。

  • 检测触发条件:至少两个线程,每个都持有一个锁并试图获取另一个线程持有的锁
  • ThreadMXBean.findDeadlockedThreads() 返回非 null 数组即表示存在 synchronized 死锁
  • 该 API 不扫描 Lock 实现,也不覆盖 wait()/notify() 引发的逻辑死锁(例如线程 A wait() 在 obj1,线程 B wait() 在 obj2,双方都不 notify())

如何用 ThreadMXBean 主动轮询检测 synchronized 死锁

适合嵌入监控 Agent 或健康检查端点。注意不要高频调用(建议间隔 ≥30 秒),否则可能因锁竞争影响性能。

ThreadMXBean bean = ManagementFactory.getThreadMXBean();
long[] deadlockedIds = bean.findDeadlockedThreads(); // 返回 null 表示无死锁
if (deadlockedIds != null) {
    ThreadInfo[] infos = bean.getThreadInfo(deadlockedIds, true, true);
    for (ThreadInfo info : infos) {
        System.out.println("Deadlocked thread: " + info.getThreadName());
        System.out.println("Locked on: " + info.getLockName());
        System.out.println("Blocked by: " + info.getLockOwnerName());
    }
}
  • 第二个参数 true 表示采集线程堆栈,第三个 true 表示采集锁信息(包括持有者和等待者)
  • 若返回 deadlockedIds 长度为 0,不代表绝对安全——可能是死锁尚未形成,或只涉及 Lock 类型
  • 在容器化环境(如 Kubernetes)中,可将此逻辑封装为 /actuator/health 子项,配合 Prometheus 抓取

jstack 和 jcmd 哪个更适合线上紧急排查?优先用 jcmd

jstack 在某些 JDK 版本(尤其是旧版 HotSpot)下会尝试对目标 JVM 全局 safepoint,导致应用暂停(STW),而 jcmd 更轻量、更可靠。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 在Java里并发编程中的死锁如何检测_Java死锁监控与排查方法解析-java教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4008813+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4008813+
  • 本周更新: 0+
  • 最后更新: 2026-03-16