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


一、java定位進程

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

可以看到進程ID,為5421的cpu這列100多了。

記下這個數字:5421

 

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

 

然后在服務器中終端輸入命令:top -Hp 5421

作用是查看里程內部線程資源占用情況。5421為第二步獲取到的進程id

 可以看到第一行cpu占用特別高,就是它了。記住,此時第一列PID是線程ID:5463

注意這個ID是十進制,但是java線程堆棧是采用是16進制。那么我們轉換一下。

printf "%x\n" 5463

輸出結果:

1557

 

三、通過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:本例方法也可用於排查線上死鎖問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM