java 死锁 解决_Java死锁故障排除和解决

java 死锁 解决

JavaOne年度会议的一大优点是主题专家介绍了几个技术和故障排除实验室。 这些实验室之一尤其引起了我的关注:Java冠军Heinz Kabutz提出的“ HOL6500-查找和解决Java死锁 ”。 这是我在该主题上看到的最好的演示之一。 我建议您自己下载,运行和研究实验室。

本文将重温这个经典的线程问题,并总结提出的关键故障排除和解决方法。 我还将根据自己的多线程故障排除经验来扩展主题。

Java死锁:这是什么?

真正的Java死锁本质上可以描述为两个或多个线程永远被阻塞,互相等待的情况。 这种情况与其他更常见的“日常”线程问题模式(例如锁争用和线程争用,等待阻塞IO调用的线程等)截然不同。这种锁排序死锁情况可以如下所示:

在上面的可视示例中,线程A和线程B尝试以不同顺序获取2个锁是致命的。 一旦线程达到死锁状态,它们将永远无法恢复,从而迫使您重新启动受影响的JVM进程。

Heinz还描述了另一种死锁: 资源死锁 。 到目前为止,这是我在Java EE企业系统故障排除经验中最常见的线程问题模式。 资源死锁本质上是指一个或多个线程正在等待获取永远无法使用的资源(例如JDBC池耗尽)的情况。

锁排序死锁

您现在应该知道我是JVM线程转储分析的忠实拥护者 ; 对于参与Java / Java EE开发或生产支持的个人而言至关重要的技能。 好消息是,大多数JVM线程转储格式(HotSpot,IBM VM…)都可以很容易地对Java级别的死锁进行开箱即用的识别,因为它们包含本机死锁检测机制,该机制实际上将向您显示所涉及的线程。真正的Java级死锁场景以及执行堆栈跟踪。 可以通过您选择的工具(例如JVisualVM,jstack)或本地工具(例如,基于Unix的操作系统上的kill -3 <PID>)捕获JVM线程转储。 运行实验1后,在JVM Java级死锁检测部分下面找到:

现在,这是容易的部分……根本原因分析工作的核心是首先了解为什么此类线程涉及死锁情况。 锁顺序死锁可能会从您的应用程序代码中触发,但是除非您参与高并发性编程,否则可能导致罪魁祸首的代码是您正在使用的第三方API或框架或实际的Java EE容器本身(如果适用)。

现在让我们在下面回顾一下亨氏提出的锁排序死锁解决策略:

#通过全局排序解决死锁(请参阅lab1解决方案)

  • 本质上涉及对锁的全局排序的定义,它将始终防止死锁(请参阅lab1解决方案)

#TryLock的死锁解析(请参阅lab2解决方案)

  • 锁定第一把锁
  • 然后尝试锁定第二把锁
  • 如果您可以锁定它,那就很好了
  • 如果不能,请重试

可以使用Java Lock&ReantrantLock来实现上述策略,这也使您可以灵活地设置等待超时,以防止在第一个锁获取时间太长的情况下导致线程不足。

public interface Lock {void lock();void lockInterruptibly() throws InterruptedException;boolean tryLock();boolean tryLock(long timeout, TimeUnit unit)throws InterruptedException;void unlock();Condition newCondition();}

如果查看JBoss AS7实现,您会注意到Lock&ReantrantLock在核心实现层中得到了广泛使用,例如:

  • 部署服务
  • EJB3实现(广泛使用)
  • 集群和会话管理
  • 内部缓存和数据结构(LRU,ConcurrentReferenceHashMap…)

现在,按照亨氏的观点,死锁解决方案策略2可能非常有效,但也需要采取适当的措施,例如通过finally {}块释放所有持有的锁,否则您可以将死锁方案转换为活动锁 。

资源僵局

现在,让我们转到资源死锁场景。 我很高兴Heinz的实验室#3涵盖了这一点,因为根据我的经验,这是迄今为止您将看到的最常见的“死锁”场景,尤其是在开发和支持大型分布式Java EE生产系统时。

现在,让我们弄清事实。

  • 资源死锁不是真正的Java级死锁
  • 如果您遇到这些类型的死锁,那么JVM线程转储将不会神奇。 这意味着您需要做更多工作来分析和理解此问题作为起点。
  • 当您刚开始学习如何读取线程转储时,线程转储分析可能会特别令人困惑,因为对于Java级死锁,线程通常会显示为RUNNING状态还是BLOCKED状态。 现在,重要的是要记住线程状态对于这种类型的问题不是那么重要,例如RUNNING state!= Healthy state。
  • 分析方法与Java级别的死锁非常不同。 您必须创建多个线程转储快照,并确定每个快照之间的线程问题/等待模式。 您将能够看到线程没有移动,例如等待从池中获取资源的线程以及已经获取并挂起资源的其他线程。
  • 线程转储分析不是这里唯一重要的数据点/事实。 您将需要收集其他事实,例如有关线程正在等待的资源,整体中间件或环境运行状况等的统计信息。所有这些事实的结合将使您能够得出根本原因以及解决策略的结论,或可能不涉及代码更改。

我将以更多的线程转储问题模式与您联系,但是首先请确保您对JVM线程转储的基本原理感到满意。

结论

我希望您像我一样有机会回顾,运行和享受亨氏演讲中的实验室。 并发编程和故障排除可能会非常具有挑战性,但是我仍然建议您花一些时间来理解其中的一些原则,因为我相信您会在不久的将来遇到某种情况,这将迫使您进行这种深入研究并掌握这些原则。技能。

参考: Java EE支持模式和Java教程博客中的JCG合作伙伴 Pierre-Hugues Charbonneau提供的Java死锁故障排除和解决方法 。

翻译自: https://www.javacodegeeks.com/2012/11/java-deadlock-troubleshooting-and-resolution.html

java 死锁 解决

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用War包部署Tomcat

前提&#xff1a; 1&#xff1a;已打包好的项目工程War文件 2&#xff1a;正常运行的Tomcat环境 当前的War文件为&#xff1a;GPCDMS.war Tomcat环境为&#xff1a;http://10.122.111.76:9080/ 具体步骤&#xff1a; 1&#xff1a;点击主页左侧 Tomcat Manager 并使用 ad…

delphi 停电文本数据丢失_NLP中的文本分析和特征工程

语言检测&#xff0c;文本清理&#xff0c;长度测量&#xff0c;情绪分析&#xff0c;命名实体识别&#xff0c;n字频率&#xff0c;词向量&#xff0c;主题建模前言在本文中&#xff0c;我将使用NLP和Python解释如何分析文本数据并为机器学习模型提取特征。NLP(自然语言处理)是…

ubuntu mv和cp命令

mv 1.txt 2.txt 将文件1.txt重命名为2.txt mv abc/ 123/ 将文件夹abc重命名为123 mv 1.txt /abc 将文件1.txt剪切粘贴导到/abc cp 1.txt abc 将文件1.txt复制到/abc cp abc /123 -r 将文件夹abc复制到文件夹123

了解一级JPA缓存

我敢打赌&#xff0c;每个Java开发人员至少听说过L1&#xff08;又名EntityManager或Session&#xff09;缓存。 但是您的理解水平足够好吗&#xff1f; 如果您不确定&#xff0c;请考虑阅读这篇文章。 首先&#xff0c;我们需要知道持久性上下文是什么。 根据EntityManager J…

使用Eclipse开发Java Web过程中Debug调试的使用方法

这里介绍的是在Eclipse中的Debug调试。首先右击项目选择Debug As -- Debug on Server 或者点击Server面板的小昆虫图标&#xff0c;启动Debug模式。 运行web项目&#xff0c;进行到需要调试的地方&#xff0c;在执行页面操作之前&#xff0c;在即将要运行的代码中添加断点&…

JS-this的使用

做前端开发已经半年之多了&#xff0c;前几天看见apply时心生疑惑&#xff0c;于是查阅了好多资料但还是不太理解&#xff0c;只知道是源于this的问题&#xff0c;今天偶然看到了阮一峰大佬的讲解js中的this问题&#xff08;http://www.ruanyifeng.com/blog/javascript/&#x…

如何从几何角度上理解方程组只有一个解_深度科普---电磁波(三):无激励下的真空中的Maxwell方程组的解...

很久没有写过与自己专业相关的文章了&#xff0c;于是计划穿插进几篇有关电磁波的深度科普的文章。计划分为几个部分&#xff1a;1. 真空中的 方程组2. 材料中的 方程组和电磁场的边值条件3. 无激励下的真空中的 方程组的解---电磁波&#xff08;本文章&#xff09;4. 稳定状态…

matlab figure被图像填充

imgimread(3.jpg);imgrgb2gray(img);figure(1);%figure名字为 Figure 1figure(name,第一);%figure名字为 Figure&#xff1a;第一figure(NumberTitle,off,Name,原图);%figure名字为原图[cols,rows]size(img);set (gcf,Position,[400,300,cols,rows]); %设置figure位置&…

Thread的run()与start()的区别

Java中thread的start()和run()的区别&#xff1a;1.start&#xff08;&#xff09;方法来启动线程&#xff0c;真正实现了多线程运行&#xff0c;这时无需等待run方法体代码执行完毕而直接继续执行下面的代码&#xff1a;通过调用Thread类的start()方法来启动一个线程&#xff…

云计算未来趋势预测:AIaaS、无服务器、云端一体化等将成重点?

云计算是一种业务模式&#xff0c;服务提供商在定制的环境中处理客户的完整基础架构和软件需求。随着云计算的发展&#xff0c;云服务和解决方案也将随之增长。 软件即服务(SaaS)预计到2020年将以18%的年均复合增长率增长&#xff0c;平台即服务(PaaS)的采用率将在2020年达到56…

C# list删除 另外list里面的元素_在Python 中 List 操作 9种例子详细了解

list的操作有循环、切片、增、删、改、查、反转、排序&#xff1b;接下来我们逐个来说一下&#xff1b;首先我们要知道&#xff0c;列表的索引&#xff08;下标&#xff09;从0开始&#xff0c;最后一个可以用-1表示。1. 循环如果直接for 循环一个list 的时候&#xff0c;那么每…

乱码

程序读入或输出乱码&#xff0c;检查文件的编码方式utf-8或是gbk等&#xff1b;检查程序的解码方式是否与文件的编码方式相同

hadoop矩阵乘法源码_使用Hadoop计算共现矩阵

hadoop矩阵乘法源码这篇文章继续我们在MapReduce的数据密集型文本处理一书中实现MapReduce算法的系列。 这次&#xff0c;我们将从文本语料库创建单词共现矩阵。 本系列以前的文章是&#xff1a; 使用MapReduce进行数据密集型文本处理 使用MapReduce进行数据密集型文本处理-本…

第六章 数组和索引器 (6.6 索引器)

【案例】本案例在Student类中定义索引器&#xff0c;然后通过stu[i] 来引用Student类的对象实例。 【案例目的】(1)掌握索引器定义与使用。 (2)理解索引器与属性的区别。 【代码】 namespace Example1 {class Program{static void Main(string[] args){Student stu new Studen…

Java Executors(线程池)

Sun在Java5中&#xff0c;对 Java线程的类库做了大量的扩展&#xff0c;其中线程池就是Java5的新特征之一&#xff0c;除了线程池之外&#xff0c;还有很多多线程相关的内容&#xff0c;为多线程的编程带来了极大便利。为了编写高效稳定可靠的多线程程序&#xff0c;线程部分的…

matlab 小括号

大括号 用于单元阵列的赋值 中括号 用于形成一个向量或矩阵小括号 通常用于一般的算术表达式,指示优先运算,还用于表示函数变量、向量下标和矩阵下标等到 小括号&#xff0c;用于引用数组的元素。 如 X(3)就是X的第三个元素。 X([1 2 3])就是X的头三个元素。 算例&#xff1a;…

如何使用CNN进行物体识别和分类_可能我们之前都想错了:CNN的图像分类策略其实出奇的简单呢!...

【新智元导读】ICLR 2019一篇论文指出&#xff1a;DNN解决ImageNet时的策略似乎比我们想象的要简单得多。这个发现使我们能够构建更具解释性和透明度的图像分类管道&#xff0c;同时也解释了现代CNN中观察到的一些现象。全文约3300字6图&#xff0c;读完可能需要10分钟CNN非常擅…

【小记】-006--关于高度塌陷的问题

最近遇到一个问题&#xff1a;当使用 position:absolute 时&#xff0c;给父元素添加 position:relative 父元素高度塌陷&#xff0c;此时如何使得父元素的高度被子元素撑开&#xff1f; 我了解到的高度塌陷无非就是&#xff1a;float属性,display:absolute/fixed属性 float与d…

StringBuffer的存在的含义

当我处理旧代码并跨StringBuffer实例运行时&#xff0c;通常将它们替换为StringBuilder实例。 尽管可以从此更改中获得性能优势&#xff0c;但我经常在我知道对性能影响不大的地方对其进行更改。 我认为&#xff0c;除了可能带来性能收益外&#xff0c;还应出于各种原因进行更改…

matlab 大括号

大括号&#xff0c;用于cell型的数组的分配或引用。 >> acell(2,1)a [][]>> a(1,1)[2,3,4,0;5,6,7,8];无法从 double 转换为 cell。>> a(1,1){[2,3,4,0;5,6,7,8]};>> a(2,1){str};>> aa [2x4 double]str >>