天天看點

Java死鎖排查和Java CPU 100% 排查的步驟整理(轉)

工欲善其事,必先利其器

本篇整理兩個排查問題的簡單技巧,一個是java死鎖排查,這個一般在面試的時會問到,如果沒有寫多線程的話,實際中遇到的機會不多;第二個是java cpu 100%排查,這個實際的開發中,線的應用出現這個問題可能性比較大,是以這裡簡單總結介紹一下,對自己學習知識的一個整理,提高自己的解決問題能力。

通過标題我們就要思考三個問題:

什麼是死鎖?

為什麼會出現死鎖?

怎麼排查代碼中出現了死鎖?

作為技術人員(工程師),在面對問題的時候,可能需要的能力是怎麼去解決這個問題。但是在學習技術知識的時候,那就要多問為什麼,一定要鍛煉自己這方面的能力,這樣才能更好的掌握知識。

解答:

死鎖是指兩個或兩個以上的程序在執行過程中,由于競争資源或者由于彼此通信而造成的一種阻塞的現象,若無外力作用,它們都将無法推進下去。此時稱系統處于死鎖狀态或系統産生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。百度百科:死鎖

注:程序和線程都可以發生死鎖,隻要滿足死鎖的條件!

從上面的概念中我們知道 (1)必須是兩個或者兩個以上程序(線程) (2)必須有競争資源

怎麼排查代碼中出現了死鎖?【重點來了】

首先寫一個死鎖的代碼,看例子:

上面這段代碼執行後,就會出現死鎖,那麼排查的方法有如下:

第一:在windons指令視窗,使用 jps -l 【不會使用jps請自行查詢資料】
第二:使用jstack -l 12316 【不會使用jstack請自行查詢資料】

在window打開 JConsole,JConsole是一個圖形化的監控工具!

在windons指令視窗 ,輸出 JConsole

在window打開 jvisualvm,jvisualvm是一個圖形化的監控工具!

在windons指令視窗 ,輸出 jvisualvm

這個如果在實際的應用開發中遇到,要怎麼排查呢?

這裡沒有一步步的圖示過程,隻有一個簡單的操作過程!有空寫一個詳細的例子。

1 、 使用top指令檢視cpu占用資源較高的PID

2、 通過jps 找到目前使用者下的java程式PID

執行 jps -l 能夠列印出所有的應用的PID,找到有一個PID和這個cpu使用100%一樣的ID!!就知道是哪一個服務了。

3、 使用 pidstat -p 1 3 -u -t

4 、 找到cpu占用較高的線程TID

通過上圖發現是 3467的TID占用cup較大

5、 将TID轉換為十六進制的表示方式

将3467轉為十六進制 d8d,注意是小寫!

6、 通過jstack -l 輸出目前程序的線程資訊

使用jstack 輸出目前PID的線程dunp資訊

7、 查找 TID對應的線程(輸出的線程id為十六進制),找到對應的代碼

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

2、然後使用jstack輸出出壓力測試時候應用的dump資訊

3、分析輸出的日志檔案中那個方法block線程占用最多,這裡可能是性能有問題,找到對應的代碼分析

1、Java應用CPU占用100%原因分析

2、[Java] CPU 100% 原因查找解決

3、線上應用故障排查系列

4、分析JAVA應用CPU占用過高的問題