讲师中心 微信公众号
AI工具推荐 视频效率加速

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

轻墨酱_7804

轻墨酱_7804

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

|

679人浏览过

|

来源于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 monitor 和 java.util.concurrent.Lock 两类锁,synchronized 和 ReentrantLock 覆盖了,但 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免费学习笔记(深入)”;

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载
  • VM.native_memory summary比-XX:NativeMemoryTracking=detail轻量,生产环境可随时跑
  • 重点关注Internal和Other区域增长,这两块常藏线程私有缓冲区泄漏
  • 若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.ThreadPark和jdk.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记录,那八成是AbstractQueuedSynchronizer的state字段被多处修改,得翻源码对齐CAS逻辑。

热门AI工具

更多
超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

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

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

2711

2025.08.06

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

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

497

2026.01.26

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

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

2966

2024.01.12

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

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

670

2024.02.23

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

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

644

2024.02.23

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

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

710

2026.02.04

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

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

3188

2023.10.19

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

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

5089

2025.10.17

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn