国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【VisualVM 簡(jiǎn)明教程】(6): 檢測(cè)死鎖

oneasp / 2148人閱讀

摘要:并且分別給出了,線程的堆棧,就可以很快定位代碼。避免無限期等待當(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

相關(guān)文章

  • 系統(tǒng)優(yōu)化怎么做-JVM優(yōu)化之開篇

    摘要:幾個(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)及代碼,來解決具體功能...

    gecko23 評(píng)論0 收藏0
  • VisualVM 簡(jiǎn)明教程】(4): 分析CPU

    摘要:快照,帶線程命令,是顯示全部進(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)致...

    ormsf 評(píng)論0 收藏0
  • JVM問題情景分析

    摘要:?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è)線程占用某資源后只能該線程自己釋放資...

    SnaiLiu 評(píng)論0 收藏0
  • java高并發(fā)系列 - 第1天:必須知道的幾個(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ù)的行為...

    zhoutk 評(píng)論0 收藏0
  • JVM詳解3.JDK監(jiān)控和故障處理工具

    摘要:點(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...

    Keven 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<