一文學會Java死鎖和CPU 100% 問題的排查技巧

做一個積極的人

編碼匹耕、改bug、提升自己

我有一個樂園馏段,面向編程,春暖花開

<font color='blue'>工欲善其事践瓷,必先利其器</font>

之前整理過一篇文章院喜,本篇是對那篇的優(yōu)化:Java死鎖排查和Java CPU 100% 排查的步驟整理和OOM FullGc案例

@[toc]

工欲善其事,必先利其器

00 本文簡介

作為一名搞技術的程序猿或者是攻城獅晕翠,想必你應該是對下面這兩個問題有所了解喷舀,說不定你在實際的工作或者面試就有遇到過:

第一個問題:Java死鎖如何排查和解決?

第二個問題:服務器CPU占用率高達到100%排查和解決淋肾?

第三個問題:有哪些工具能夠快速查看線程使用情況硫麻?

本文對這三個問題進行總結整理,通過實例演示講解巫员,精彩干貨庶香,不容錯過啊简识!

前戲就這么多赶掖,高潮會很多,做好了七扰,讓我們直奔主題奢赂,發(fā)動小船,Let's go颈走!

小船

01 Java死鎖排查和解決

要排查和解決死鎖膳灶,首先思考三個問題:

1. 什么是死鎖?

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

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

4. 如何避免寫出死鎖的代碼?

作為技術人員(工程師)锐膜,在出現(xiàn)問題的時候毕箍,能夠盡快的去解決這個問題。但是在學習技術知識的時候道盏,還是腳踏實地而柑,多問一些為什么文捶,一個好的問題,能夠讓自己思考媒咳,這方面的能力也一定要鍛煉鍛煉哦粹排,這樣才能更好的理解和掌握知識,并探究/觸碰到更深入的地方涩澡。

1顽耳、啥是死鎖?

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

死鎖圖示

注:進程和線程都可以發(fā)生死鎖茎辐,只要滿足死鎖的條件宪郊!

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

從上面的概念中我們知道

(1)必須是兩個或者兩個以上進程(線程)

(2)必須有競爭資源

3弛槐、怎么排查代碼中出現(xiàn)了死鎖?【重點來了】

首先整一個死鎖的代碼依啰,看例子:

死鎖小demo

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

第一個姿勢:使用 jps + jstack

:在windons命令窗口速警,使用jps -l【不會使用jps請自行查詢資料】

jps -l 命令

:使用 jstack -l 12316 【不會使用jstack請自行查詢資料】

jstack

第二個姿勢:使用jconsole

在window打開 JConsole叹誉,JConsole是一個圖形化的監(jiān)控工具嗡午!

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

這里寫圖片描述

:選擇到線程的tab上轩触,如下截圖忙灼。

這里寫圖片描述

第三個姿勢:使用Java Visual VM

在window打開 jvisualvm匠襟,jvisualvm是一個圖形化的監(jiān)控工具!

:在windons命令窗口 该园,輸出 jvisualvm

Java Visual VM

:依然是切換到線程這個TAB上酸舍,很明顯的就有提示!

死鎖檢測

4里初、如何避免死鎖父腕?

上面說了死鎖出現(xiàn)的原因以及通過三種方式來檢測和排查死鎖,下面更重要的東西來了青瀑,就是如何避免死鎖璧亮,如果能夠讓寫出的代碼避免死鎖出現(xiàn)也就沒有上面這些排查的過程了。最好的是從源頭控制問題斥难,而不是后期遇到問題在去填坑枝嘶。

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


<font color='red'>【強制】</font>對多個資源群扶、數(shù)據(jù)庫表、對象同時加鎖時镀裤,需要保持一致的加鎖順序竞阐,否則可能會
造成死鎖。
說明:線程一需要對表 A暑劝、B骆莹、C 依次全部加鎖后才可以進行更新操作,那么線程二的加鎖順序也必須是
A担猛、B幕垦、C,否則可能出現(xiàn)死鎖傅联。


02先改、Java CPU 100% 排查技巧

第一個姿勢,步驟有點多蒸走,難度四星

平時多積累一點仇奶,這樣在遇到問題的時候就少句求人的話。如果在實際的開發(fā)中遇到CPU 100%問題比驻,要怎么排查呢该溯?如果你沒有遇到過這個問題,請先自己思考10s嫁艇,如果你遇到過朗伶,這個時候也正好可以在回顧一遍。

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

top命令

當前占用cup100% 的PID為3455论皆。

、通過jps找到當前用戶下的java程序PID

執(zhí)行jps -l能夠打印出所有的應用的PID猾漫,找到有一個PID和這個cpu使用100%一樣的ID5闱纭!悯周!就知道是哪一個服務了粒督。知道了對應的服務,在接著后續(xù)的分析步驟禽翼。

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

-p:指定進程號
-u:默認的參數(shù)族跛,顯示各個進程的cpu使用統(tǒng)計
-t:顯示選擇任務的線程的統(tǒng)計信息外的額外信息
這里寫圖片描述

這里寫圖片描述

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

礁哄、 因為jstack命令輸出文件記錄的線程ID是16進制。因此我們先將TID轉換為十六進制的表示方式溪北,轉換方式可以參考下圖桐绒。

3467轉為十六進制 d8d,注意是小寫之拨!! 記錄下來茉继,后面會使用。

巧轉進制

蚀乔、通過jstack [-l] PID輸出當前進程的線程信息

jstack PID  /temp/test.log

烁竭、查找 TID對應的線程(輸出的線程id為十六進制),找到對應的代碼乙墙,使用命令查找哦颖变,不要肉眼比對,具體命令請思考听想,給你表現(xiàn)機會腥刹。

查找

找到之后具體分析這個線程在干什么,為什么會占用這么多的 CUP資源汉买。

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

NEW,未啟動的衔峰。不會出現(xiàn)在Dump中。
RUNNABLE,在虛擬機內執(zhí)行的蛙粘。
BLOCKED,受阻塞并等待監(jiān)視器鎖垫卤。
WATING,無限期等待另一個線程執(zhí)行特定操作。
TIMED_WATING,有時限的等待另一個線程的特定操作出牧。
TERMINATED,已退出的穴肘。

第二個姿勢,待開發(fā)[奸笑臉]

此處省略......舔痕,好多字评抚。

03 推薦兩個高效排查問題工具

show-busy-java-threads

在這里插入圖片描述

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

簡單安裝和使用過程:

  1. 下載 show-busy-java-threads
  2. 上傳服務器,然后進行解壓
  3. 然后執(zhí)行對應的命令
這里寫圖片描述

:阿里開源的問題定位神器 arthas 來定位問題伯复。

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

這個里面有很多命令慨代,如thread 支持一鍵展示當前最忙的前N個線程并打印堆棧,最簡單的 thread -n 10 即可將最忙碌的十個線程快照打印出來啸如,真正高效侍匙。

在這里插入圖片描述

定位神器 arthas 安裝過程就做介紹了,如果你還沒有用過這個工具叮雳,我建議一定去用一下想暗,說不定你會愛上它妇汗!

04 總結

本文內容比較多,基本上是手把手的教程了说莫,希望能夠對你有所幫助铛纬,也建議沒有遇到類似問題的伙伴,看完之后一定要親自去實踐一下操作過程唬滑,如果沒有環(huán)境可以自行想辦法搞一個測試例子。還是老話:不要眼高手低棺弊,看了和做了本質上兩個概念晶密,最終收獲的也一定不同。

05 彩蛋-另一個姿勢

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

1模她、在進行壓力測試的時候稻艰,使用jps找到應用的PID

2、然后使用jstack輸出出壓力測試時候應用的dump信息

3侈净、分析輸出的日志文件中那個方法block線程占用最多尊勿,這里可能是性能有問題,找到對應的代碼分析

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末畜侦,一起剝皮案震驚了整個濱河市元扔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旋膳,老刑警劉巖澎语,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異验懊,居然都是意外死亡擅羞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門义图,熙熙樓的掌柜王于貴愁眉苦臉地迎上來减俏,“玉大人,你說我怎么就攤上這事碱工⊥蕹校” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵痛垛,是天一觀的道長草慧。 經常有香客問我,道長匙头,這世上最難降的妖魔是什么漫谷? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮蹂析,結果婚禮上舔示,老公的妹妹穿的比我還像新娘碟婆。我一直安慰自己,他們只是感情好惕稻,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布竖共。 她就那樣靜靜地躺著,像睡著了一般俺祠。 火紅的嫁衣襯著肌膚如雪公给。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天蜘渣,我揣著相機與錄音淌铐,去河邊找鬼。 笑死蔫缸,一個胖子當著我的面吹牛腿准,可吹牛的內容都是我干的。 我是一名探鬼主播拾碌,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼吐葱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了校翔?” 一聲冷哼從身側響起弟跑,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎展融,沒想到半個月后窖认,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡告希,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年扑浸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片燕偶。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡喝噪,死狀恐怖,靈堂內的尸體忽然破棺而出指么,到底是詐尸還是另有隱情酝惧,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布伯诬,位于F島的核電站晚唇,受9級特大地震影響,放射性物質發(fā)生泄漏盗似。R本人自食惡果不足惜哩陕,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悍及,春花似錦闽瓢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缨叫,卻和暖如春椭符,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耻姥。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工艰山, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咏闪。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像摔吏,于是被迫代替她去往敵國和親鸽嫂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內容