Java死鎖故障排除和解決

JavaOne年度會議的一大優點是,主題專家介紹了幾個技術和故障排除實驗室。 其中的一個實驗室今年特別吸引了我的注意力:“ HOL6500-查找和解決Java死鎖 ”,由Java冠軍Heinz Kabutz提出 。 這是我在該主題上看到的最好的演示之一。 我建議您自己下載,運行和研究實驗室。

本文將重溫這個經典的線程問題,并總結提出的關鍵故障排除和解決方法。 我還將根據自己的多線程故障排除經驗來擴展主題。

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

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

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

相關文章

java.util.scanner sc_關于Java的Scanner的問題,菜鳥求各大神解答

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓package leetcode;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.…

3. HTML中的容器標簽

什么是容器標簽&#xff1f;在HTML開發中我們常常會使用一類標簽作為容器放置一些內容&#xff0c;我們把這類標簽稱之為容器標簽&#xff0c;可以作為容器標簽的包括列表標簽、表格標簽、框架標簽、布局標簽&#xff0c;在這里我們就來總結下這些內容。 列表標簽 1 <!-- 無…

python自帶sqlite庫_Python標準庫之sqlite3使用實例

Python自帶一個輕量級的關系型數據庫SQLite。這一數據庫使用SQL語言。SQLite作為后端數據庫&#xff0c;可以搭配Python建網站&#xff0c;或者制作有數據存儲需求的工具。SQLite還在其它領域有廣泛的應用&#xff0c;比如HTML5和移動端。Python標準庫中的sqlite3提供該數據庫的…

GitHub上Java的Bloom Bloom實現

布隆過濾器是集數據結構的一種 。 對于那些不了解的對象&#xff0c;“設置數據結構”僅包含一個主要方法。 它僅用于確定特定元素是否包含在一組元素中。 大多數數據結構&#xff08;例如Hash Map &#xff0c; Linked List或Array &#xff09;都可以相當輕松地創建此函數。 …

Hibernate(十五):QBC檢索、本地SQL檢索和HQL刪除

QBC檢索QBC查詢就是通過使用Hibernate提供的Query By Criteria API來查詢對象&#xff0c;這種API封裝了SQL語句的動態拼裝&#xff0c;對查詢提供了更加面向對象的功能接口。 1&#xff09;通過Critera實現具有條件的查詢 1 Test2 public void testCriteria00() {3 …

java 創建連接池失敗_java-Presto JDBC連接池創建錯誤“不支持禁用...

我正在嘗試使用Spring-JDBC連接到Presto,并且我正在使用Hikari CP作為數據源.這是我的配置&#xff1a;Beanpublic DataSource myDataSource() {HikariDataSource hikariDataSource new HikariDataSource();hikariDataSource.setDriverClassName("com.facebook.presto.jd…

ni軟件管理器_NI 技術支持丨我的 NI 硬件設備不能被識別,怎么辦?Windows

這篇指南可以幫助您解決在您的 Windows 系統上無法識別您的 NI 硬件有關的問題。癥狀包括以下幾種情況&#xff1a;連接至 USB 端口時&#xff0c;硬件上的 LED 燈不亮/不閃爍。連接至 USB 后已連接設備的 LED 燈持續閃爍。僅限音頻接口&#xff1a;該設備在音頻應用程序或 Win…

環境搭建相關

1.檢測jre運行環境 java -version 沒有的話 按照提示安裝 default-jre 夠用 http://www.linuxidc.com/Linux/2016-11/136958.htm 否則按照上面處理 2.pycharm下載 https://www.jetbrains.com/pycharm/download/ 選擇下載一個linux的 3.下載crackjar http://idea.lanyus.com/jar…

在Java應用程序中使用密碼學

這篇文章描述了如何使用Java密碼體系結構 &#xff08;JCA&#xff09;&#xff0c;該體系結構使您可以在應用程序中使用密碼服務。 Java密碼體系結構服務 JCA提供了許多加密服務&#xff0c;例如消息摘要和簽名 。 這些服務可以通過特定于服務的API來訪問&#xff0c;例如Me…

CSS學習筆記-04 a標簽-導航練習

個人練習&#xff0c;各位大神勿笑 。。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv&qu…

AngularJs簡介

AngualrJs是一個javascript框架&#xff0c;它通過<script>標簽加到HTML頁面中。 Angular通過指令拓展了HTML&#xff0c;且通過表達式綁定數據到HTML。 Angular是一個javascript框架 Angular是一個javascript框架。它是一個以javascript編寫的庫。 Angular是以一個javas…

java怎樣訪問servlet_如何訪問URL并從java servlet獲取響應?

你需要做這樣的事情import java.io.*;import java.net.URL;import java.net.URLConnection;import javax.servlet.http.*;import javax.servlet.*;public class URLServlet extends HttpServlet {public void doGet(HttpServletRequest req, HttpServletResponse res)throws Se…

深度學習loss值變為0_利用TensorFlow2.0為膽固醇、血脂、血壓數據構建時序深度學習模型(python源代碼)...

背景數據描述膽固醇、高血脂、高血壓是壓在廣大中年男性頭上的三座大山&#xff0c;如何有效的監控他們&#xff0c;做到早發現、早預防、早治療尤為關鍵&#xff0c;趁著這個假期我就利用TF2.0構建了一套時序預測模型&#xff0c;一來是可以幫我預發疾病&#xff0c;二來也可以…

在Spring MVC Web應用程序中使用reCaptcha

CAPTCHA是一種程序&#xff0c;可以生成人類可以通過的測試并對其進行評分&#xff0c;而計算機程序“ 不能 ”通過。 所采取的策略之一是向用戶顯示具有扭曲文本的圖像&#xff0c;并且用戶應在輸入區域中書寫文本。 如果顯示的文字與用戶輸入的文字相同&#xff0c;則我們可以…

洛谷 P1757 通天之分組背包

P1757 通天之分組背包 題目背景 直達通天路小A歷險記第二篇 題目描述 自01背包問世之后&#xff0c;小A對此深感興趣。一天&#xff0c;小A去遠游&#xff0c;卻發現他的背包不同于01背包&#xff0c;他的物品大致可分為k組&#xff0c;每組中的物品相互沖突&#xff0c;現在&a…

課時109.外邊距合并現象(掌握)

我們先寫一個案例&#xff0c;通過案例來了解 它們之間的水平距離就是兩個間距的和 我們看完水平再來看垂直方向 在默認布局的垂直方向上&#xff0c;默認情況下外邊距是不會疊加的&#xff0c;會出現合并現象&#xff0c;誰的外邊距比較大就聽誰的 本文轉載于:猿2048?https:…

純 CSS實現三角形

最近項目上做評論回復&#xff0c;設計師提高交互性特意設計了小三角&#xff0c;如下&#xff1a; 下面介紹一下實現效果的css方法&#xff1a; 1.border 通過設置上下左右border寬度來實現。 首先查看一下全部設置的效果&#xff1a; <style>   .triangle{     w…

python access_Python3 os.access() 方法

Python3 os.access() 方法概述os.access() 方法使用當前的uid/gid嘗試訪問路徑。大部分操作使用有效的 uid/gid, 因此運行環境可以在 suid/sgid 環境嘗試。語法access()方法語法格式如下&#xff1a;os.access(path, mode);參數path -- 要用來檢測是否有訪問權限的路徑。mode -…

小米的java待遇怎么樣_【Java工資】小米2021年Java工資待遇-看準網

已經不是面試官遲到的問題了&#xff0c;是約好了面試時間&#xff0c;結果徹底沒有然后了&#xff0c;這種言而無信我頭一回見。小米運營部門令人困惑的工作作風&#xff0c;簡單總結一句就是&#xff1a;敷衍不走心&#xff0c;面試規則內部都不統一。兩次面小米&#xff0c;…

Spring MVC表單驗證(帶批注)

這篇文章提供了一個簡單HTML表單驗證示例。 它基于帶有注釋的Spring MVC示例。 該代碼可在GitHub的Spring-MVC-Form-Validation目錄中找到。 數據 在此示例中&#xff0c;我們將使用bean和JSR303驗證批注&#xff1a; public class MyUser {NotNullSize(min1,max20)private …