最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一篇文章學(xué)會(huì)java死鎖與CPU 100%的排查

 更新時(shí)間:2021年08月24日 11:46:20   作者:阿飛云  
這篇文章主要介紹了一篇文章學(xué)會(huì)java死鎖與CPU 100%的排查,文中主要介紹了Java死鎖以及服務(wù)器CPU占用率達(dá)到100%時(shí)的排查和解決方法,感興趣的朋友一起來(lái)看一看吧

00 本文簡(jiǎn)介

作為一名搞技術(shù)的程序猿或者是攻城獅,想必你應(yīng)該是對(duì)下面這兩個(gè)問(wèn)題有所了解,說(shuō)不定你在實(shí)際的工作或者面試就有遇到過(guò):

第一個(gè)問(wèn)題:Java死鎖如何排查和解決?

第二個(gè)問(wèn)題:服務(wù)器CPU占用率高達(dá)到100%排查和解決?

第三個(gè)問(wèn)題:有哪些工具能夠快速查看線程使用情況?

本文對(duì)這三個(gè)問(wèn)題進(jìn)行總結(jié)整理,通過(guò)實(shí)例演示講解,精彩干貨,不容錯(cuò)過(guò)??!

前戲就這么多,高潮會(huì)很多,做好了,讓我們直奔主題,發(fā)動(dòng)小船,Let's go!

小船

01 Java死鎖排查和解決

要排查和解決死鎖,首先思考三個(gè)問(wèn)題:

1. 什么是死鎖?

2. 為什么會(huì)出現(xiàn)死鎖?

3. 怎么排查代碼中出現(xiàn)了死鎖?

4. 如何避免寫(xiě)出死鎖的代碼?

作為技術(shù)人員(工程師),在出現(xiàn)問(wèn)題的時(shí)候,能夠盡快的去解決這個(gè)問(wèn)題。但是在學(xué)習(xí)技術(shù)知識(shí)的時(shí)候,還是腳踏實(shí)地,多問(wèn)一些為什么,一個(gè)好的問(wèn)題,能夠讓自己思考,這方面的能力也一定要鍛煉鍛煉哦,這樣才能更好的理解和掌握知識(shí),并探究/觸碰到更深入的地方。

1、啥是死鎖?

死鎖是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過(guò)程中,由于競(jìng)爭(zhēng)資源或者由于彼此通信而造成的一種阻塞的現(xiàn)象,若無(wú)外力作用,它們都將無(wú)法推進(jìn)下去。此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程稱為死鎖進(jìn)程。[百度百科:死鎖]

死鎖圖示

注:進(jìn)程和線程都可以發(fā)生死鎖,只要滿足死鎖的條件!

2、為啥子會(huì)出現(xiàn)死鎖?

從上面的概念中我們知道

(1)必須是兩個(gè)或者兩個(gè)以上進(jìn)程(線程)

(2)必須有競(jìng)爭(zhēng)資源

3、怎么排查代碼中出現(xiàn)了死鎖?【重點(diǎn)來(lái)了】

首先整一個(gè)死鎖的代碼,看例子:

死鎖小demo

上面這段代碼執(zhí)行后,就會(huì)出現(xiàn)死鎖,那么排查的方法有如下:

第一個(gè)姿勢(shì):使用 jps + jstack

:在windons命令窗口,使用jps -l【不會(huì)使用jps請(qǐng)自行查詢資料】

jps -l 命令

:使用 jstack -l 12316 【不會(huì)使用jstack請(qǐng)自行查詢資料】

jstack

第二個(gè)姿勢(shì):使用jconsole

在window打開(kāi) JConsole,JConsole是一個(gè)圖形化的監(jiān)控工具!

:在windons命令窗口 ,輸出 JConsole,如下圖:

這里寫(xiě)圖片描述

:選擇到線程的tab上,如下截圖。

這里寫(xiě)圖片描述

第三個(gè)姿勢(shì):使用Java Visual VM

在window打開(kāi) jvisualvm,jvisualvm是一個(gè)圖形化的監(jiān)控工具!

:在windons命令窗口 ,輸出 jvisualvm

Java Visual VM

:依然是切換到線程這個(gè)TAB上,很明顯的就有提示!

死鎖檢測(cè)

4、如何避免死鎖?

上面說(shuō)了死鎖出現(xiàn)的原因以及通過(guò)三種方式來(lái)檢測(cè)和排查死鎖,下面更重要的東西來(lái)了,就是如何避免死鎖,如果能夠讓寫(xiě)出的代碼避免死鎖出現(xiàn)也就沒(méi)有上面這些排查的過(guò)程了。最好的是從源頭控制問(wèn)題,而不是后期遇到問(wèn)題在去填坑。

我看了阿里巴巴中最新的開(kāi)發(fā)規(guī)約,里面有對(duì)避免死鎖的說(shuō)明,具體如下:


【強(qiáng)制】對(duì)多個(gè)資源、數(shù)據(jù)庫(kù)表、對(duì)象同時(shí)加鎖時(shí),需要保持一致的加鎖順序,否則可能會(huì)
造成死鎖。
說(shuō)明:線程一需要對(duì)表 A、B、C 依次全部加鎖后才可以進(jìn)行更新操作,那么線程二的加鎖順序也必須是
A、B、C,否則可能出現(xiàn)死鎖。


02、Java CPU 100% 排查技巧

第一個(gè)姿勢(shì),步驟有點(diǎn)多,難度四星

平時(shí)多積累一點(diǎn),這樣在遇到問(wèn)題的時(shí)候就少句求人的話。如果在實(shí)際的開(kāi)發(fā)中遇到CPU 100%問(wèn)題,要怎么排查呢?如果你沒(méi)有遇到過(guò)這個(gè)問(wèn)題,請(qǐng)先自己思考10s,如果你遇到過(guò),這個(gè)時(shí)候也正好可以在回顧一遍。

、 使用top命令查看cpu占用資源較高的PID

top命令

當(dāng)前占用cup100% 的PID為3455。

、通過(guò)jps找到當(dāng)前用戶下的java程序PID

這步可省略,主要是通過(guò)jps知道是那個(gè)JAVA服務(wù)的PID

執(zhí)行jps -l能夠打印出所有的應(yīng)用的PID,找到有一個(gè)PID和這個(gè)cpu使用100%一樣的ID?。?!就知道是哪一個(gè)服務(wù)了。知道了對(duì)應(yīng)的服務(wù),在接著后續(xù)的分析步驟。

、 使用 pidstat -p < PID > 1 3 -u -t

如果這個(gè)命令 pidstat不可用,這步可使用 top -H -p pid 查詢進(jìn)程下線程信息

-p:指定進(jìn)程號(hào)
-u:默認(rèn)的參數(shù),顯示各個(gè)進(jìn)程的cpu使用統(tǒng)計(jì)
-t:顯示選擇任務(wù)的線程的統(tǒng)計(jì)信息外的額外信息

這里寫(xiě)圖片描述
這里寫(xiě)圖片描述

、找到cpu占用較高的線程TID ,通過(guò)上圖發(fā)現(xiàn)是 3467的TID占用cup較大

、 因?yàn)閖stack命令輸出文件記錄的線程ID是16進(jìn)制。因此我們先將TID轉(zhuǎn)換為十六進(jìn)制的表示方式,轉(zhuǎn)換方式可以參考下圖。

3467轉(zhuǎn)為十六進(jìn)制 d8d,注意是小寫(xiě)!! 記錄下來(lái),后面會(huì)使用。

巧轉(zhuǎn)進(jìn)制

、通過(guò)jstack [-l] PID輸出當(dāng)前進(jìn)程的線程信息

jstack PID  /temp/test.log

、查找 TID對(duì)應(yīng)的線程(輸出的線程id為十六進(jìn)制),找到對(duì)應(yīng)的代碼,使用命令查找哦,不要肉眼比對(duì),具體命令請(qǐng)思考,給你表現(xiàn)機(jī)會(huì)。

查找

找到之后具體分析這個(gè)線程在干什么,為什么會(huì)占用這么多的 CUP資源。

PS:線程的幾種狀態(tài)如下說(shuō)明:

NEW,未啟動(dòng)的。不會(huì)出現(xiàn)在Dump中。
RUNNABLE,在虛擬機(jī)內(nèi)執(zhí)行的。
BLOCKED,受阻塞并等待監(jiān)視器鎖。
WATING,無(wú)限期等待另一個(gè)線程執(zhí)行特定操作。
TIMED_WATING,有時(shí)限的等待另一個(gè)線程的特定操作。
TERMINATED,已退出的。

第二個(gè)姿勢(shì),待開(kāi)發(fā)[奸笑臉]

此處省略…,好多字。

03 推薦兩個(gè)高效排查問(wèn)題工具

show-busy-java-threads

在這里插入圖片描述

官網(wǎng)地址:show-busy-java-threads: https://github.com/oldratlee/useful-scripts/blob/master/docs/java.md#-show-busy-java-threads

簡(jiǎn)單安裝和使用過(guò)程:

下載 show-busy-java-threads上傳服務(wù)器,然后進(jìn)行解壓然后執(zhí)行對(duì)應(yīng)的命令

這里寫(xiě)圖片描述

:阿里開(kāi)源的問(wèn)題定位神器 arthas 來(lái)定位問(wèn)題。

官網(wǎng)地址:arthas :https://alibaba.github.io/arthas/index.html

這個(gè)里面有很多命令,如thread 支持一鍵展示當(dāng)前最忙的前N個(gè)線程并打印堆棧,最簡(jiǎn)單的 thread -n 10 即可將最忙碌的十個(gè)線程快照打印出來(lái),真正高效。

在這里插入圖片描述

定位神器 arthas 安裝過(guò)程就做介紹了,如果你還沒(méi)有用過(guò)這個(gè)工具,我建議一定去用一下,說(shuō)不定你會(huì)愛(ài)上它!

04 總結(jié)

本文內(nèi)容比較多,基本上是手把手的教程了,希望能夠?qū)δ阌兴鶐椭?,也建議沒(méi)有遇到類(lèi)似問(wèn)題的伙伴,看完之后一定要親自去實(shí)踐一下操作過(guò)程,如果沒(méi)有環(huán)境可以自行想辦法搞一個(gè)測(cè)試?yán)印_€是老話:不要眼高手低,看了和做了本質(zhì)上兩個(gè)概念,最終收獲的也一定不同。

05 彩蛋-另一個(gè)姿勢(shì)

也可以通過(guò)使用jstack找到系統(tǒng)的代碼性能問(wèn)題

1、在進(jìn)行壓力測(cè)試的時(shí)候,使用jps找到應(yīng)用的PID

2、然后使用jstack輸出出壓力測(cè)試時(shí)候應(yīng)用的dump信息

3、分析輸出的日志文件中那個(gè)方法block線程占用最多,這里可能是性能有問(wèn)題,找到對(duì)應(yīng)的代碼分析

到此這篇關(guān)于一篇文章學(xué)會(huì)java死鎖與CPU 100%的排查的文章就介紹到這了,更多相關(guān)java死鎖與CPU 100%的排查內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Java 中的單元測(cè)試

    淺談Java 中的單元測(cè)試

    這篇文章主要介紹了Java 中的單元測(cè)試的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • Java NIO寫(xiě)大文件對(duì)比(win7和mac)

    Java NIO寫(xiě)大文件對(duì)比(win7和mac)

    這篇文章主要介紹了Java NIO寫(xiě)大文件對(duì)比(win7和mac),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 基于JavaMail的Java郵件發(fā)送

    基于JavaMail的Java郵件發(fā)送

    電子郵件的應(yīng)用非常廣泛,例如在某網(wǎng)站注冊(cè)了一個(gè)賬戶,自動(dòng)發(fā)送一封歡迎郵件,通過(guò)郵件找回密碼,自動(dòng)批量發(fā)送活動(dòng)信息等。本文將簡(jiǎn)單介紹如何通過(guò) Java 代碼來(lái)創(chuàng)建電子郵件,并連接郵件服務(wù)器發(fā)送郵件
    2021-10-10
  • Java生產(chǎn)1-100的隨機(jī)數(shù)簡(jiǎn)單實(shí)例(分享)

    Java生產(chǎn)1-100的隨機(jī)數(shù)簡(jiǎn)單實(shí)例(分享)

    下面小編就為大家?guī)?lái)一篇Java生產(chǎn)1-100的隨機(jī)數(shù)簡(jiǎn)單實(shí)例(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • IDEA如何實(shí)現(xiàn)查看UML類(lèi)圖

    IDEA如何實(shí)現(xiàn)查看UML類(lèi)圖

    這篇文章主要介紹了IDEA如何實(shí)現(xiàn)查看UML類(lèi)圖問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Mybatis實(shí)現(xiàn)ResultMap結(jié)果集

    Mybatis實(shí)現(xiàn)ResultMap結(jié)果集

    本文主要介紹了Mybatis實(shí)現(xiàn)ResultMap結(jié)果集,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 詳解SpringBoot啟動(dòng)類(lèi)的掃描注解的用法及沖突原則

    詳解SpringBoot啟動(dòng)類(lèi)的掃描注解的用法及沖突原則

    這篇文章主要介紹了詳解SpringBoot啟動(dòng)類(lèi)的掃描注解的用法及沖突原則,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • spring?bean標(biāo)簽中的init-method和destroy-method詳解

    spring?bean標(biāo)簽中的init-method和destroy-method詳解

    這篇文章主要介紹了spring?bean標(biāo)簽中的init-method和destroy-method,在很多項(xiàng)目中,經(jīng)常在xml配置文件中看到init-method 或者 destroy-method ,因此整理收集下,方便以后參考和學(xué)習(xí),需要的朋友可以參考下
    2023-04-04
  • JavaWeb中的Cookie和Session解讀

    JavaWeb中的Cookie和Session解讀

    這篇文章主要介紹了JavaWeb中的Cookie和Session解讀,Cookie是servlet發(fā)送到Web瀏覽器的少量信息,該信息由瀏覽器保存,然后發(fā)送回服務(wù)器,一般情況下,Cookie是以鍵值對(duì)進(jìn)行表示的,Cookie的值可以唯一地標(biāo)識(shí)客戶端,因此Cookie常用于會(huì)話管理,需要的朋友可以參考下
    2023-10-10
  • 淺析java中stringBuilder的用法

    淺析java中stringBuilder的用法

    下面小編就為大家?guī)?lái)一篇淺析java中stringBuilder的用法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05

最新評(píng)論

马尔康县| 若尔盖县| 东方市| 久治县| 康平县| 连江县| 金华市| 和龙市| 阿城市| 靖州| 高阳县| 无极县| 延长县| 兴山县| 繁峙县| 盈江县| 日照市| 英吉沙县| 万宁市| 阿拉善左旗| 连云港市| 策勒县| 邵武市| 介休市| 茂名市| 云林县| 封丘县| 六枝特区| 新沂市| 四川省| 玛纳斯县| 牡丹江市| 洛川县| 和平区| 临西县| 东平县| 金溪县| 监利县| 石门县| 鄂州市| 鹤峰县|