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