java线程死锁_Java线程死锁–案例研究

java线程死锁

本文将描述从在IBM JVM 1.6上运行的Weblogic 11g生产系统中观察到的最新Java死锁问题的完整根本原因分析。

此案例研究还将证明掌握线程转储分析技能的重要性; 包括用于IBM JVM Thread Dump格式。

环境规格

– Java EE服务器:Oracle Weblogic Server 11g和Spring 2.0.5 –操作系统:AIX 5.3 – Java VM:IBM JRE 1.6.0 –平台类型:门户和订购应用程序
监控和故障排除工具
– JVM线程转储(IBM JVM格式)– Compuware Server Vantage(Weblogic JMX监视和警报)

问题概述

从Compuware Server Vantage观察到并报告了一个严重的线程阻塞问题,该问题影响了我们的2台Weblogic 11g生产托管服务器,从而导致了最终用户的应用程序影响和超时情况。

事实的收集和验证

像往常一样,Java EE问题调查需要收集技术和非技术事实,因此我们可以得出其他事实和/或就根本原因进行结论。 在采取纠正措施之前,要对以下事实进行验证,以便得出根本原因:
·对客户有什么影响? 中(在16个中只有2个受管服务器/ JVM受影响)·受影响平台的最新更改? 是(新的与JMS相关的异步组件)·最近到受影响平台的流量增加了吗? 否·这个问题如何表现出来? 观察到线程突然增加,导致线程快速耗尽。·Weblogic托管服务器重新启动是否解决了问题? 是的,但是几个小时后问题又回来了(不可预测的间歇性模式)

结论1

该问题与间歇性卡住的线程行为有关,该行为当时仅影响少数Weblogic托管服务器

结论2

由于问题是断断续续的,因此不太可能出现全局根本原因,例如下游系统无响应

线程转储分析–第一遍

处理滞留的线程问题时,要做的第一件事是生成JVM线程转储。 无论您的环境规格和问题背景如何,这都是一条黄金法则。 JVM线程转储快照为您提供了有关活动线程及其当时正在执行的处理/任务类型的重要信息。
现在回到我们的案例研究,生成了一个IBM JVM线程转储(javacore.xyz格式),它确实揭示了以下Java线程死锁情况:

1LKDEADLOCK    Deadlock detected !!!NULL           ---------------------NULL           2LKDEADLOCKTHR  Thread '[STUCK] ExecuteThread: '8' for queue: 'weblogic.kernel.Default (self-tuning)'' (0x000000012CC08B00)3LKDEADLOCKWTR    is waiting for:4LKDEADLOCKMON      sys_mon_t:0x0000000126171DF8 infl_mon_t: 0x0000000126171E38:4LKDEADLOCKOBJ      weblogic/jms/frontend/FESession@0x07000000198048C0/0x07000000198048D8: 3LKDEADLOCKOWN    which is owned by:2LKDEADLOCKTHR  Thread '[STUCK] ExecuteThread: '10' for queue: 'weblogic.kernel.Default (self-tuning)'' (0x000000012E560500)3LKDEADLOCKWTR    which is waiting for:4LKDEADLOCKMON      sys_mon_t:0x000000012884CD60 infl_mon_t: 0x000000012884CDA0:4LKDEADLOCKOBJ      weblogic/jms/frontend/FEConnection@0x0700000019822F08/0x0700000019822F20: 3LKDEADLOCKOWN    which is owned by:2LKDEADLOCKTHR  Thread '[STUCK] ExecuteThread: '8' for queue: 'weblogic.kernel.Default (self-tuning)'' (0x000000012CC08B00)

死锁情况可以按照以下方式进行翻译:
– Weblogic线程8正在等待获取Weblogic线程10拥有的对象监视器锁
– Weblogic线程#10正在等待获取Weblogic线程#8拥有的对象监视器锁 结论: Weblogic线程#8和#10都在等待。 永远! 现在,在深入分析根本原因之前,让我为您提供有关Java Thread死锁的高级概述。

Java线程死锁概述

你们大多数人可能都熟悉Java Thread死锁原理,但是您真的遇到了真正的死锁问题吗?

根据我的经验,真正的Java死锁很少见,并且在过去的10年中,我仅见过约5次此类事件。 原因是大多数与线程卡住有关的问题是由于线程挂起情况(正在等待远程IO调用等)引起的,而不是与其他线程发生真正的死锁情况。
Java线程死锁是一种情况,例如,线程A正在等待获取线程B持有的对象监视器锁定,而线程B本身正在等待获取线程A持有的对象监视器锁定。这两个线程将永远彼此等待。 这种情况可以如下图所示:

线程死锁已确认……现在该怎么办?
一旦确认了死锁( 大多数JVM Thread Dump实现将为您突出显示 ),下一步就是通过检查死锁情况下涉及的每个线程及其当前任务和等待条件,来进行更深入的分析。
在我们的问题案例中,对于涉及死锁条件的每个线程,在部分线程堆栈跟踪下面找到: **请注意,出于保密目的,真实应用程序Java包名称已重命名**

Weblogic线程#8

'[STUCK] ExecuteThread: '8' for queue: 'weblogic.kernel.Default (self-tuning)'' J9VMThread:0x000000012CC08B00, j9thread_t:0x00000001299E5100, java/lang/Thread:0x070000001D72EE00, state:B, prio=1(native thread ID:0x111200F, native priority:0x1, native policy:UNKNOWN)Java callstack:at weblogic/jms/frontend/FEConnection.stop(FEConnection.java:671(Compiled Code))at weblogic/jms/frontend/FEConnection.invoke(FEConnection.java:1685(Compiled Code))at weblogic/messaging/dispatcher/Request.wrappedFiniteStateMachine(Request.java:961(Compiled Code))at weblogic/messaging/dispatcher/DispatcherImpl.syncRequest(DispatcherImpl.java:184(Compiled Code))at weblogic/messaging/dispatcher/DispatcherImpl.dispatchSync(DispatcherImpl.java:212(Compiled Code))at weblogic/jms/dispatcher/DispatcherAdapter.dispatchSync(DispatcherAdapter.java:43(Compiled Code))at weblogic/jms/client/JMSConnection.stop(JMSConnection.java:863(Compiled Code))at weblogic/jms/client/WLConnectionImpl.stop(WLConnectionImpl.java:843)at org/springframework/jms/connection/SingleConnectionFactory.closeConnection(SingleConnectionFactory.java:342)at org/springframework/jms/connection/SingleConnectionFactory.resetConnection (SingleConnectionFactory.java:296)at org/app/JMSReceiver.receive()……………………………………………………………………

Weblogic线程#10

'[STUCK] ExecuteThread: '10' for queue: 'weblogic.kernel.Default (self-tuning)'' J9VMThread:0x000000012E560500, j9thread_t:0x000000012E35BCE0, java/lang/Thread:0x070000001ECA9200, state:B, prio=1(native thread ID:0x4FA027, native priority:0x1, native policy:UNKNOWN)Java callstack:at weblogic/jms/frontend/FEConnection .getPeerVersion(FEConnection.java:1381(Compiled Code))at weblogic/jms/frontend/FESession.setUpBackEndSession(FESession.java:755(Compiled Code))at weblogic/jms/frontend/FESession.consumerCreate(FESession.java:1025(Compiled Code))at weblogic/jms/frontend/FESession.invoke(FESession.java:2995(Compiled Code))at weblogic/messaging/dispatcher/Request.wrappedFiniteStateMachine(Request.java:961(Compiled Code))at weblogic/messaging/dispatcher/DispatcherImpl.syncRequest(DispatcherImpl.java:184(Compiled Code))at weblogic/messaging/dispatcher/DispatcherImpl.dispatchSync(DispatcherImpl.java:212(Compiled Code))at weblogic/jms/dispatcher/DispatcherAdapter.dispatchSync(DispatcherAdapter.java:43(Compiled Code))at weblogic/jms/client/JMSSession.consumerCreate(JMSSession.java:2982(Compiled Code))at weblogic/jms/client/JMSSession.setupConsumer(JMSSession.java:2749(Compiled Code))at weblogic/jms/client/JMSSession.createConsumer(JMSSession.java:2691(Compiled Code))at weblogic/jms/client/JMSSession.createReceiver(JMSSession.java:2596(Compiled Code))at weblogic/jms/client/WLSessionImpl.createReceiver(WLSessionImpl.java:991(Compiled Code))at org/springframework/jms/core/JmsTemplate102.createConsumer(JmsTemplate102.java:204(Compiled Code))at org/springframework/jms/core/JmsTemplate.doReceive(JmsTemplate.java:676(Compiled Code))at org/springframework/jms/core/JmsTemplate$10.doInJms(JmsTemplate.java:652(Compiled Code))at org/springframework/jms/core/JmsTemplate.execute(JmsTemplate.java:412(Compiled Code))at org/springframework/jms/core/JmsTemplate.receiveSelected(JmsTemplate.java:650(Compiled Code))at org/springframework/jms/core/JmsTemplate.receiveSelected(JmsTemplate.java:641(Compiled Code))at org/app/JMSReceiver.receive()……………………………………………………………

正如您在上面的Thread Strack跟踪中看到的那样,这种死锁确实来自我们的应用程序代码,该应用程序代码使用Spring框架API进行JMS使用者实现(在不使用MDB的情况下非常有用)。 堆栈跟踪非常有趣,它揭示了两个线程都在同一个 Weblogic JMS使用者会话/连接的竞争状态下,并导致死锁情况:
– Weblogic线程#8试图重置关闭当前的JMS连接– Weblogic线程#10试图使用相同的JMS连接/会话以创建新的JMS使用者–触发了线程死锁!

根本原因:非线程安全的Spring JMS SingleConnectionFactory实现

Spring JIRA错误数据库的代码回顾和快速研究确实揭示了以下与以下分析完美相关的以下线程安全缺陷:
#SingleConnectionFactory的resetConnection导致与基础OracleAQ的JMS连接的死锁https://jira.springsource.org/browse/SPR-5987
Spring SingleConnectionFactory的补丁发布于2009年,确实涉及添加适当的sync {}块,以防止在发生JMS Connection重置操作时线程死锁:

synchronized (connectionMonitor) {//if condition added to avoid possible deadlocks when trying to reset the target connection if (!started) {this.target.start(); started = true; }}

我们的团队目前正计划将该Spring补丁不久后集成到我们的生产环境中。 在我们的测试环境中执行的初始测试是肯定的。

结论

我希望这个案例研究能够帮助您理解现实中的Java Thread死锁问题,以及适当的Thread Dump分析技能如何使您能够在代码级快速查明与线程相关的问题。 请不要犹豫,发表任何评论或问题。

参考: Java线程死锁– Java EE支持模式和Java教程博客上的JCG合作伙伴 Pierre-Hugues Charbonneau的案例研究 。


翻译自: https://www.javacodegeeks.com/2012/06/java-thread-deadlock-case-study.html

java线程死锁

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

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

相关文章

JS实现禁止浏览器后退返回上一页

<script type"text/javascript"> $(function() {//防止页面后退history.pushState(null, null, document.URL);window.addEventListener(popstate, function () {history.pushState(null, null, document.URL);});}) </script>

网页中文乱码--UTF-8和GB2312互转

一、如果你想把utf-8转为GB2312 1、用记事本打开源码&#xff0c;把换成&#xff1b;如果是JS不需要加这句&#xff0c;如果是网页最好加上这句和你页面对应的编码。 2、用记事本打开源码&#xff0c;另存为&#xff0c;编码 哪里选择 ANSI 即可。 二、如果你想把GB2312转为…

将JAR依赖项添加到Eclipse插件Maven Tycho构建

开发OPP项目时&#xff0c;一直困扰着我的是使用硬编码Java库依赖项。 我手动下载了所用库的jar &#xff0c;将其复制到需要它们的插件中的目录中&#xff0c;然后将其添加到MANIFEST.MF文件中。 您可能会问我为什么要这样做。 好吧&#xff0c;Eclipse插件&#xff08;或更正…

如何查看一个网站是否部署了SSL证书?

如何才能确定一个网站是否部署了安全的SSL证书呢&#xff1f; 答&#xff1a;能用https方式访问的站点 如果此网站部署SSL证书&#xff0c;则在需要加密的页面会自动从 http:// 变为 https:// &#xff0c;如果没有变&#xff0c;你认为此页面应该加密&#xff0c;您也可以尝试…

页面加载时模块移入动画---wow

首先官网下载&#xff1a;https://github.com/matthieua/WOW animate.css wow.js 1&#xff0c;在头部引用animate.css <link rel"stylesheet" href"css/animate.css">2&#xff0c;body底部引入wow.js 且初始化一下 <script src"js/wow.…

人工智能的概念和知识构架_概念验证:玩! 构架

人工智能的概念和知识构架我们正在开始一个新项目&#xff0c;我们必须选择Web框架。 我们的默认选择是grails&#xff0c;因为团队已经拥有使用它的经验&#xff0c;但是我决定给Play&#xff01; 和Scala有机会。 玩&#xff01; 有很多很酷的东西&#xff0c;在我的评估中&a…

团队-科学计算器-模块测试过程

项目托管平台地址&#xff1a;https://gitee.com/mamamayun/KeXueJiSuanQia/tree/master/calculator_soul3.5 模块测试:进行加减乘除运算 测试方法:反复进行计算 其他补充说明: 无 转载于:https://www.cnblogs.com/dunianze/p/8092874.html

linux 系统安装mongodb数据库---方法2

我是安装在/home/mongodb 1&#xff0c;进入/home/mongodb wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.7.tgz tar -zxvf mongodb-linux-x86_64-4.0.7.tgz cd mongodb-linux-x86_64-4.0.7/ 创建两个目录 存放数据库和日记 mkdir -p logs mkdir -p dat…

网络排错命令工具

ping tracert nslookup dig netstat 转载于:https://www.cnblogs.com/changha0/p/8111134.html

JLBH示例4 – QuickFix vs ChronicleFix基准化

在这篇文章中&#xff1a; 使用JLBH测试QuickFIX 观察QuickFix延迟如何通过百分位数降低 比较QuickFIX和Chronicle FIX 如JLBH简介中所述&#xff0c;创建JLBH的主要原因是为了测量Chronicle-FIX引擎。 我们使用了JLBH的所有功能&#xff0c;特别是吞吐量杠杆和协调遗漏的…

设计模式----java的单例模式

单例模式&#xff08;Singleton Pattern&#xff09;是一个比较简单的模式&#xff0c;它确保某一个类只有一个实例&#xff0c;而且自行实例化并向整个系统提供这个实例。今天我们就来学习一下单例模式的用法。有生之年&#xff0c;一起去看看这个美丽易碎的世界。凡有等待&am…

linux下安装pm2

提前安装node linux下安装pm2 全局安装 npm install pm2 -g安装完成后可以查看pm2的所在目录 创建软连接----根据上面的安装目录创建 ln -s /home/node/nodejs/lib/node_modules/pm2/bin/pm2 /usr/local/bin/查看进程 pm2 list安装成功&#xff01;&#xff01;&#xff…

主机关机后第二天就无法开机_工控机几种常见的在开机或关机后不能正常使用的故障处理方法汇总...

工控机开机启动时我们经常会碰到各种不能正常使用的问题&#xff0c;下面我们把这类故障现象及处理方法在这里给大家汇总分析一下&#xff0c;希望你在碰到类似的问题时&#xff0c;能给你们提供一定的帮助&#xff01;故障现象一&#xff1a;工控机在开机过程中出现死机故障.故…

搭建PHP本地服务器(XAMPP)

1.下载XAMPP集成包 https://www.apachefriends.org/download.html2.启动前修改配置文件httpd.conf的端口号&#xff0c;例如&#xff1a;Listen 80803.启动Apache、MySQL4.找到XAMPP安装目录&#xff0c;并在xampp/htdocs下面新建一个文件夹作为你的网站根目录&#xff0c;譬如…

jboss as7 下载_JBoss AS 7:定制登录模块

jboss as7 下载JBoss AS 7很整洁&#xff0c;但是文档仍然很缺乏&#xff08;错误消息没有那么有用&#xff09;。 这篇文章总结了如何创建自己的兼容JavaEE的登录模块&#xff0c;以对部署在JBoss AS上的Web应用程序的用户进行身份验证。 提供了一个工作的基本用户名密码模块。…

网站添加页面热力图--百度统计

1&#xff0c;注册百度统计的账户并登录 https://tongji.baidu.com/web/10000307684/welcome/login 2&#xff0c;新增网站 管理-网站列表-自有网站-新增网站 3&#xff0c;新增网页热力图 基础报告-页面点击图-新增点击图 4&#xff0c;复制统计代码 把统计的代码放到…

pandas中inplace_pandas回顾小结(二)

上一篇&#xff1a;橘猫吃不胖&#xff1a;pandas回顾小结&#xff08;一&#xff09;​zhuanlan.zhihu.comIndexIndex也有很多种类型&#xff0c;官方文档介绍&#xff1a;Index objects - pandas 1.1.4 documentationindex是可以包含重复值的df pd.DataFrame([[1,2,3],[4,5,…

beta总结

总结随笔 项目预期计划 完成Alpha阶段未完成的功能&#xff0c;并对Alpha阶段做出的项目做出一些修改&#xff0c;比如增加一些功能&#xff0c;美观页面等。 现实进展 经过7天的Beta冲刺&#xff0c;项目预期计划里所希望做得到的全部完成了&#xff0c;实现了增加学生老师&am…

统计网页访问量

1&#xff0c;注册账户&#xff0c;登录 https://www.umeng.com/ 2&#xff0c;生成统计代码 产品-网站统计-立即使用-添加站点-统计代码 生成的代码&#xff1a; <script type"text/javascript">document.write(unescape("%3Cspan idcnzz_stat_icon_…

Swing应用程序中的CDI事件可将UI与事件处理分离

在享受了几年围绕CDI构建我的代码的乐趣之后&#xff0c;使用它根据众所周知的模式来构造我的代码非常自然。 CDI是一种旨在在Java EE应用程序服务器中使用的依赖项注入机制&#xff0c;这可能被视为不利。 但是&#xff0c;我想证明它可以在Java SE应用程序中使用并且具有巨大…