0

0

深入理解Java中的死锁检测与预防_线程排查工具与避免策略分享

P粉602998670

P粉602998670

发布时间:2026-02-18 13:20:01

|

639人浏览过

|

来源于php中文网

原创

java死锁快速确认依赖threadmxbean.finddeadlockedthreads(),它仅检测object monitor和reentrantlock两类锁,返回线程id需配合getthreadinfo()获取堆栈,且频繁调用有性能开销。

深入理解java中的死锁检测与预防_线程排查工具与避免策略分享

Java死锁怎么快速确认是ThreadMXBean.findDeadlockedThreads()在起作用

JDK自带的死锁检测能力就藏在这个接口里,但它默认不触发自动报警,得你主动调用。很多线上问题排查时反复看thread dump却漏掉死锁,就是因为没意识到这个API才是“真·检测入口”。

常见错误现象:jstack -l <pid></pid>输出里出现Found 1 deadlock.,但自己写的监控脚本没报,说明没走findDeadlockedThreads()逻辑。

  • 它只检测 Object monitorjava.util.concurrent.Lock 两类锁,synchronizedReentrantLock 覆盖了,但 StampedLock 或自定义AQS实现不在此列
  • 返回的是线程ID数组,不是Thread对象,要配合ThreadMXBean.getThreadInfo()才能拿到堆栈
  • 频繁调用有性能开销(需全局暂停所有线程),别放在高频监控循环里,建议5分钟以上间隔

jcmd <pid> VM.native_memory summary</pid>辅助判断死锁是否引发内存卡死

死锁本身不直接吃内存,但被卡住的线程如果还在反复申请堆外资源(比如Netty的PooledByteBufAllocator),就可能触发本地内存耗尽——这时候OutOfMemoryError: Direct buffer memory会掩盖真正的死锁根源。

使用场景:服务响应变慢、GC正常但RSS持续上涨、jstack显示大量线程停在Unsafe.park,这时就要查原生内存。

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

LOGO.com
LOGO.com

在线生成Logo,100%免费

下载
  • VM.native_memory summary-XX:NativeMemoryTracking=detail轻量,生产环境可随时跑
  • 重点关注InternalOther区域增长,这两块常藏线程私有缓冲区泄漏
  • Internal占比突增且线程数稳定,大概率是某类锁等待导致缓冲区堆积(比如Kafka消费者线程卡在poll()前的锁上,但心跳缓冲还在分配)

为什么ReentrantLock.tryLock(long, TimeUnit)加超时不能彻底防死锁

加了超时只是让单次获取失败,不代表逻辑安全。很多人以为用了tryLock就高枕无忧,结果在线程复用场景下(比如线程池+异步回调),失败后没清理前置已持有的锁,反而制造出更难追踪的“伪死锁”。

参数差异:tryLock(1, SECONDS)tryLock(100, MILLISECONDS)看似只是单位不同,但前者在锁竞争激烈时更容易因调度延迟误判为超时。

  • 必须配对使用lockInterruptibly()或显式unlock(),否则finally块里没写unlock(),一次超时就会让锁永远滞留
  • 多个锁按固定顺序获取仍是硬要求,tryLock不解决顺序问题,只解决“等多久”的问题
  • Spring的@Transactional底层用ReentrantLock时,若传播行为是REQUIRES_NEW,嵌套事务可能触发同一线程重复获取锁,此时tryLock超时反而掩盖了设计缺陷

jfr start --settings profile --duration 60s抓取死锁现场时最常忽略的三个配置点

JFR能录到死锁发生前200ms的线程状态变化,但默认配置下大概率录不到关键帧——不是工具不行,是开关没拧对。

容易踩的坑:只开profile模板,却没启用jdk.ThreadParkjdk.JavaMonitorEnter事件,导致只能看到线程停在哪行代码,看不到它在等哪个锁对象。

  • 必须加--event jdk.JavaMonitorEnter#enabled=true,否则synchronized锁等待不记录
  • --event jdk.ReentrantLockLock#enabled=true单独开启,profile模板默认不包含它
  • --disk=false强制内存录制,避免I/O延迟错过死锁瞬间;但要注意JVM堆外内存占用会临时增加约50MB
死锁排查真正卡住人的地方,从来不是“找不到”,而是“找到了却不敢信”——比如findDeadlockedThreads()返回空,但业务明显卡死,这时候得想到StampedLock或JNI层锁不在检测范围内;又或者JFR里看到线程在park,但锁对象ID对不上任何monitor记录,那八成是AbstractQueuedSynchronizerstate字段被多处修改,得翻源码对齐CAS逻辑。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

142

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

81

2026.01.26

kafka消费者组有什么作用
kafka消费者组有什么作用

kafka消费者组的作用:1、负载均衡;2、容错性;3、广播模式;4、灵活性;5、自动故障转移和领导者选举;6、动态扩展性;7、顺序保证;8、数据压缩;9、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

174

2024.01.12

kafka消费组的作用是什么
kafka消费组的作用是什么

kafka消费组的作用:1、负载均衡;2、容错性;3、灵活性;4、高可用性;5、扩展性;6、顺序保证;7、数据压缩;8、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

156

2024.02.23

rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

205

2024.02.23

Java 流式处理与 Apache Kafka 实战
Java 流式处理与 Apache Kafka 实战

本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。

108

2026.02.04

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1508

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

423

2025.10.17

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

561

2026.02.13

热门下载

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

精品课程

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

共23课时 | 3.6万人学习

C# 教程
C# 教程

共94课时 | 9.6万人学习

Java 教程
Java 教程

共578课时 | 67.2万人学习

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

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