記一次linux經過jstack定位CPU使用太高問題或排查線上死鎖問題

1、java定位進程java

在服務器中終端輸入命令:top服務器

能夠看到進程ID,爲5421的cpu這列100多了。spa

記下這個數字:5421線程

 

2、定位問題進程對應的線程

 

而後在服務器中終端輸入命令:top -Hp 5421blog

做用是查看里程內部線程資源佔用狀況。5421爲第二步獲取到的進程id進程

 能夠看到第一行cpu佔用特別高,就是它了。記住,此時第一列PID是線程ID:5463資源

注意這個ID是十進制,可是java線程堆棧是採用是16進制。那麼咱們轉換一下。循環

printf "%x\n" 5463終端

輸出結果:grep

1557

 

3、經過jstack命令找到線程對應代碼

 

如今咱們須要用到以前的進程ID(5421)和線程的16進制數字(1557)。

在服務器中終端輸入命令:jstack -l 5421|grep 1557 -C 8

可看到線程處於運行狀態,代碼在BugDemoController類的17行,也就是咱們的循環所在行。

這裏解釋一下grep後頁-C 8意思是顯示查找目標行的先後8行,不加的話就只有一行,可能一時看不出問題來。

固然你也能夠更改一下:

-A 8後8行

-B 8前8行

PS:本例方法也可用於排查線上死鎖問題。

相關文章
相關標籤/搜索