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虛擬機:IBM JRE 1.6.0 –平臺類型:門戶和訂購應用程序
監控和故障排除工具
– JVM線程轉儲(IBM JVM格式)– Compuware Server Vantage(Weblogic JMX監視和警報)

問題概述

從Compuware Server Vantage觀察到并報告了一個嚴重的線程阻塞問題,該問題影響了我們的2臺Weblogic 11g生產托管服務器,從而導致了最終用戶的應用程序影響和超時情況。

事實的收集和驗證

像往常一樣,Java EE問題調查需要收集技術和非技術事實,因此我們可以得出其他事實和/或就根本原因進行結論。 在采取糾正措施之前,要對以下事實進行核實,以便得出根本原因:
·對客戶有什么影響? MEDIUM(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持有的對象監視器鎖,而該線程本身正等待獲取線程A持有的對象監視器鎖。這兩個線程將永遠彼此等待。 這種情況可以如下圖所示:

線程死鎖已確認……現在該怎么辦?
一旦確認了死鎖( 大多數JVM線程轉儲實現將為您突出顯示 ),下一步就是通過檢查死鎖情況下涉及的每個線程及其當前任務和等待條件,來進行更深入的分析。
在我們的問題案例中,對于涉及死鎖條件的每個線程,在部分線程堆棧跟蹤下面找到: **請注意,出于保密目的,真實應用程序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()……………………………………………………………

如您在上面的“線程跟蹤跟蹤”中所看到的,這種死鎖確實來自我們的應用程序代碼,該應用程序代碼使用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線程死鎖問題,以及適當的線程轉儲分析技能如何使您能夠在代碼級快速查明與線程相關的卡住問題的根本原因。 請不要猶豫,發表任何評論或問題。

參考: Java Thread死鎖–來自我們的JCG合作伙伴 Pierre-Hugues Charbonneau的案例研究 ,位于Java EE支持模式和Java教程博客上。


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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372336.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372336.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372336.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

bzoj1968: [Ahoi2005]COMMON 約數研究

水題。。。 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define rep(i,s,t) for(int is;i<t;i) int main(){int ans0,n;scanf("%d",&n);rep(i,1,n) ansn/i;printf("%d\n…

題目1457:非常可樂(廣度優先遍歷BFS)

題目鏈接&#xff1a;http://ac.jobdu.com/problem.php?pid1457 詳解鏈接&#xff1a;https://github.com/zpfbuaa/JobduInCPlusPlus 參考代碼&#xff1a; // // 1457 非常可樂.cpp // Jobdu // // Created by PengFei_Zheng on 22/04/2017. // Copyright © 2017 Pe…

mysql查詢某張表的所有外鍵_oracle中查詢所有外鍵引用到某張表的記錄

歡迎進入Oracle社區論壇&#xff0c;與200萬技術人員互動交流 >>進入 oracle中查詢所有外鍵引用到某張表的記錄 //查詢表的主鍵約束名 select * from user_constraints e where e.table_name表名;--輸入 //查詢所有引用到該主鍵的記錄 select b.table_name,b.column_歡迎…

BTrace for Java應用程序簡介

本文的目的是學習如何使用BTrace動態跟蹤/觀察正在運行的Java應用程序&#xff08;JDK 6&#xff09;&#xff0c;而無需更改應用程序的代碼和配置參數。 什么是BTrace&#xff1f; BTrace是一個開源項目&#xff0c;始于2007年&#xff0c;最初由A.Sundararajan和K.Balasubra…

叢銘俁 160809324 (作業1)

老師&#xff0c;助教好&#xff01;我是計科3班的叢銘俁&#xff0c;我的性格陽光開朗&#xff0c;待人大方友善&#xff0c;凡事不喜歡斤斤計較&#xff1b;本人熱心&#xff0c;喜歡樂于助人&#xff0c;也喜歡和積極向上的人交朋友。最喜歡打羽毛球&#xff0c;其次是籃球&…

mysql死鎖分析_MySQL死鎖分析

熟悉或者了解數據庫的朋友都知道鎖的概念&#xff0c;這里不做過多的解析&#xff01;鎖的種類有很多&#xff0c;不同數據庫的鎖管理方式也不同。這里主要談下MySQL innodb引擎下的死鎖。死鎖通俗的來講就是2個事務相互請求對方持有的鎖&#xff0c;這樣就會造成2個事務相互等…

在Akka中實現主從/網格計算模式

主從模式是容錯和并行計算的主要示例。 模式背后的想法是將工作劃分為相同的子任務&#xff0c;然后將其委派給從屬。 這些從節點或實例將處理工作任務&#xff0c;并將結果發送回主節點。 然后主節點將編譯從所有從節點接收到的結果。關鍵是從節點僅知道如何處理任務&#xff…

java學習筆記總略

二、正文&#xff08;一&#xff09;Java1.接口和抽象類的區別①抽象類里可以有構造方法&#xff0c;而接口內不能有構造方法。②抽象類中可以有普通成員變量&#xff0c;而接口中不能有普通成員變量。③抽象類中可以包含非抽象的普通方法&#xff0c;而接口中所有的方法必須是…

react實現路由跳轉_react實現hash路由

眾所周知&#xff0c;目前單頁面使用的路由有兩種實現方式&#xff1a;hash 模式history 模式hash 模式路由原理&#xff1a;我們先來看hash模式&#xff0c;頁面首次加載時需要在load事件中解析初始的URL&#xff0c;從而展示進入的頁面。當 # 后面的哈希值發生變化時&#xf…

Java中的Google協議緩沖區

總覽 協議緩沖區是一種用于結構化數據的開源編碼機制。 它是由Google開發的&#xff0c;旨在實現語言/平臺中立且可擴展。 在本文中&#xff0c;我的目的是介紹Java平臺上下文中協議緩沖區的基本用法。 Protobuff比XML更快&#xff0c;更簡單&#xff0c;并且比JSON更緊湊。 當…

匈牙利哦模板 二分匹配 完全匹配問題

匈牙利算法的核心思想就是 騰空間, 有條件 創造,沒條件也要創造! bool find(int x){int i,j;for (j1;j<m;j){ //掃描每個被匹配的人 if (line[x][j]true && used[j]false) //如果有關系并且還沒有標記過(這里標記的意思是這次查找曾試圖改變過的歸屬問題&a…

ThinkPHP 中驗證碼的看不清切換

<!--HTML頁面--> <!DOCTYPE html><html><head> <title></title></head><body><script type"text/javascript" src"__PUBLIC__/js/jquery-1.8.2.min.js"></script><form action"{:U(H…

mysql從表截取信息_mysql中循環截取用戶信息并插入到目標表對應的字段中

操作環境&#xff1a;有表game_list&#xff0c;字段&#xff1a;uid&#xff0c;score1&#xff0c;score2&#xff0c;seat_id&#xff0c;last_update&#xff1b;傳入參數為i_player_detail &#xff0c;傳入的值為多個用戶的id、之前分數、之后分數、座位號&#xff0c;每…

Java中的數組,列表,集合,映射,元組,記錄文字

有時&#xff0c;當我對JavaScript的強大功能和表現力感到興奮時&#xff0c;我發現自己錯過了Java世界中的一兩個功能。 除了lambda表達式/閉包或任何您想稱為“匿名函數”的東西之外&#xff0c;它還對數組&#xff0c;數組&#xff0c;列表&#xff0c;集合&#xff0c;映射…

mysql鎖表問題的解決方法_MYSQL鎖表問題的解決方法

本文實例講述了MYSQL鎖表問題的解決方法。分享給大家供大家參考&#xff0c;具體如下&#xff1a;很多時候&#xff01;一不小心就鎖表&#xff01;這里講解決鎖表終極方法&#xff01;案例一mysql>show processlist;參看sql語句一般少的話mysql>kill thread_id;就可以解…

linux——(1)初識linux

linux有窗口管理員環境和純文本界面環境&#xff0c;同時linux默認提供6個Terminal來讓用戶登錄。crtlaltF1-6可自由切換。其中如果窗口管理員環境處于運行狀態&#xff0c;那么可以按crtlaltF7直接切過去。 常用命令&#xff1a; cd [dir] #進入dir目錄下 ls #列出當前目錄下的…

4.26學習成果

哇&#xff0c;今天終于開始接觸Web了&#xff0c;感覺有點小興奮&#xff0c;這幾天看來那個視頻感覺挺有趣的&#xff0c;挺奇妙的。看到人家敲代碼&#xff0c;感覺好厲害。但是感覺不懂&#xff0c;所以&#xff0c;要努力學習了。 今天的學習成果&#xff1a; 網頁由什么組…

將Glassfish 3連接到外部ActiveMQ 5代理

介紹 在ONVZ&#xff0c;我們將Glassfish 3用作開發和生產應用服務器&#xff0c;我們對其性能和穩定性以及周圍的廣大社區感到非常滿意。 我很少遇到在stackoverflow或java.net上沒有匹配解決方案的問題。 作為我們開源策略的一部分&#xff0c;我們還運行了一個定制的ActiveM…

esp8266 lcd 天氣_ESP8266 顯示實時天氣信息

代碼文件getdata.h#include #include #include #include #include #include #include #define DEBUG 1#define MAX_CONTENT_SIZE 2000const char* ssid "weather";const char* password "mymymymy";WiFiClient client;HTTPClient http;char response[MAX…

【VS開發】visual studio 2015的NuGet Manager解決方案管理功能

NuGet的官方說明是&#xff1a;NuGet是一款Visual Studio的擴展&#xff0c;它可以簡單的安裝、升級開源庫和工具。 官網地址&#xff1a;http://www.nuget.org/ 官網最醒目的位置就是下載鏈接&#xff0c;安裝完成后我們來快速體驗一把。 手上有個小項目需要使用到json格式&am…