摘要:并且分別給出了,線程的堆棧,就可以很快定位代碼。避免無限期等待當(dāng)一個(gè)線程必須等待另外一個(gè)線程的時(shí)候,最好加上一個(gè)等待時(shí)間。
運(yùn)行了一段時(shí)間的程序,可能因?yàn)椴恍⌒牡囊恍┬薷模斐伤梨i,本人就VisualVM簡(jiǎn)單的介紹下死鎖的檢測(cè)。
死鎖程序package jvisualVM; public class DeadLock { public static void main(String[] args) { Resource r1 = new Resource(); Resource r0 = new Resource(); Thread myTh1 = new LockThread1(r1, r0); Thread myTh0 = new LockThread0(r1, r0); myTh1.setName("DeadLock-1 "); myTh0.setName("DeadLock-0 "); myTh1.start(); myTh0.start(); } } class Resource { private int i; public int getI() { return i; } public void setI(int i) { this.i = i; } } class LockThread1 extends Thread { private Resource r1, r2; public LockThread1(Resource r1, Resource r2) { this.r1 = r1; this.r2 = r2; } @Override public void run() { int j = 0; while (true) { synchronized (r1) { System.out.println("The first thread got r1"s lock " + j); synchronized (r2) { System.out.println("The first thread got r2"s lock " + j); } } j++; } } } class LockThread0 extends Thread { private Resource r1, r2; public LockThread0(Resource r1, Resource r2) { this.r1 = r1; this.r2 = r2; } @Override public void run() { int j = 0; while (true) { synchronized (r2) { System.out.println("The second thread got r2"s lock " + j); synchronized (r1) { System.out.println("The second thread got r1"s lock" + j); } } j++; } } }分析
本地的話vvm會(huì)立刻提醒有死鎖程序,遠(yuǎn)程的話,生成線程Dump文件即可,發(fā)現(xiàn)是線程DeadLock-0,DeadLock-1處于監(jiān)控狀態(tài),很有可能是造成死鎖的線程,點(diǎn)擊線程Dump。
打開Dump文件,發(fā)現(xiàn)如下:
這是一個(gè)java級(jí)別的死鎖(java代碼造成的),DeadLock-0 線程想給公共資源(0x00000007d7a080d8, a com.mousycoder.server.thead.Resource)加鎖,但是這個(gè)資源還是被DeadLock-1線程占有。DeadLock-1線程想去給公共資源(object 0x00000007d7a080e8, a com.mousycoder.server.thead.Resource)加鎖,但是這個(gè)資源被DeadLock占有。
并且分別給出了,線程的堆棧,就可以很快定位代碼。
避免死鎖策略死鎖是并發(fā)程序設(shè)計(jì)中十分常見的邏輯錯(cuò)誤。
避免嵌套鎖
本例子就是嵌套鎖,當(dāng)你已經(jīng)給一個(gè)資源上鎖后,避免再去鎖住另一個(gè)。
只對(duì)需要的地方加鎖
比如只是要對(duì)特定的字段加鎖,就不要鎖住整個(gè)obejct。
避免無限期等待
當(dāng)一個(gè)線程必須等待另外一個(gè)線程的時(shí)候,最好加上一個(gè)等待時(shí)間。超過時(shí)間,自動(dòng)放棄本操作,避免進(jìn)程懸掛。
把大事務(wù)拆成小事務(wù)
早提交,早回滾。
整個(gè)VisaulVm教程就結(jié)束了
感謝您的耐心閱讀,如果您發(fā)現(xiàn)文章中有一些沒表述清楚的,或者是不對(duì)的地方,請(qǐng)給我留言,你的鼓勵(lì)是作者寫作最大的動(dòng)力,
如果您認(rèn)為本文質(zhì)量不錯(cuò),讀后覺得收獲很大,不妨小額贊助我一下,讓我更有動(dòng)力繼續(xù)寫出高質(zhì)量的文章。
支付寶
微信
作 者 : @mousycoder
原文出處 : http://mousycoder.com/2016/02...
創(chuàng)作時(shí)間:2016-2-15
更新時(shí)間:2016-2-15
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/65474.html
摘要:幾個(gè)死鎖場(chǎng)景兩個(gè)線程相互調(diào)用導(dǎo)致互相等待同步結(jié)束。線程為了檢測(cè)死鎖,它需要遞進(jìn)地檢測(cè)所有被請(qǐng)求的鎖。思考題線程有哪些狀態(tài)這些線程大多處于什么樣的狀態(tài)分布我們可以稱系統(tǒng)運(yùn)行是健康的。 前言 在上一期Tomcat優(yōu)化中,針對(duì)JVM相關(guān)主要參數(shù)做過一定說明,這一期主要介紹進(jìn)行一些概念及經(jīng)驗(yàn)。后面分章節(jié)去講述相關(guān)工具的基本使用。 優(yōu)化優(yōu)先級(jí) 整體來講,系統(tǒng)優(yōu)化應(yīng)先優(yōu)化架構(gòu)及代碼,來解決具體功能...
摘要:快照,帶線程命令,是顯示全部進(jìn)程,是顯示線程,全格式輸出顯示進(jìn)程樹,不加顯示所有實(shí)時(shí)快照推薦程度按數(shù)字從小到大。 有時(shí)候好好的程序放到生產(chǎn)服務(wù)器上一段時(shí)間后,就會(huì)發(fā)現(xiàn)服務(wù)器響應(yīng)緩慢,進(jìn)而進(jìn)一步發(fā)現(xiàn)是cpu過高,于是就慌了,造成cpu過高的原因很多,不過大多是由于資源吃緊造成,例如:sql執(zhí)行過慢,程序里存在死循環(huán),數(shù)據(jù)庫(kù)連接未釋放,網(wǎng)絡(luò)阻塞導(dǎo)致的第三方框架代碼出現(xiàn)死循環(huán),大量的操作導(dǎo)致...
摘要:?jiǎn)栴}分析之死鎖產(chǎn)生死鎖必須同時(shí)滿足以下四個(gè)條件互斥條件一段時(shí)間內(nèi)某資源只能被一個(gè)線程進(jìn)程占有,若有其他請(qǐng)求線程只能等待。問題分析之內(nèi)存泄露內(nèi)存溢出堆內(nèi)存溢出內(nèi)存泄露指的是申請(qǐng)內(nèi)存后無法釋放該內(nèi)存。 問題分析之死鎖 產(chǎn)生死鎖必須同時(shí)滿足以下四個(gè)條件: 互斥條件:一段時(shí)間內(nèi)某資源只能被一個(gè)線程(進(jìn)程)占有,若有其他請(qǐng)求線程只能等待。 不剝奪條件:一個(gè)線程占用某資源后只能該線程自己釋放資...
摘要:并發(fā)和并行并發(fā)和并行是兩個(gè)非常容易被混淆的概念。并發(fā)說的是在一個(gè)時(shí)間段內(nèi),多件事情在這個(gè)時(shí)間段內(nèi)交替執(zhí)行。并行說的是多件事情在同一個(gè)時(shí)刻同事發(fā)生。由于線程池是一個(gè)線程,得不到執(zhí)行,而被餓死,最終導(dǎo)致了程序死鎖的現(xiàn)象。 同步(Synchronous)和異步(Asynchronous) 同步和異步通常來形容一次方法調(diào)用,同步方法調(diào)用一旦開始,調(diào)用者必須等到方法調(diào)用返回后,才能繼續(xù)后續(xù)的行為...
摘要:點(diǎn)擊進(jìn)入我的博客命令行工具這些工具大多數(shù)是類庫(kù)的一層薄的包裝,它們的主要功能代碼是在類庫(kù)中實(shí)現(xiàn)的。可視化工具是到目前為止隨發(fā)布的功能最強(qiáng)大的運(yùn)行監(jiān)視和故障處理程序,并且可以預(yù)見在未來一段時(shí)間內(nèi)都是官方主力發(fā)展的虛擬機(jī)故障處理工具。 點(diǎn)擊進(jìn)入我的博客 3.1 JDK命令行工具 showImg(https://segmentfault.com/img/remote/14600000174...
閱讀 2247·2021-11-23 09:51
閱讀 1042·2021-11-18 10:02
閱讀 3434·2021-10-13 09:49
閱讀 1262·2021-09-22 14:57
閱讀 10391·2021-08-18 10:20
閱讀 1181·2019-08-30 15:55
閱讀 2225·2019-08-29 16:06
閱讀 3232·2019-08-29 11:14