線上CPU飈高(死迴圈,死鎖...)?幫你迅速定位程式碼位置
1.top基本使用
top 命令執行圖:

第一行:基本資訊

第二行:任務資訊

第三行:CPU使用情況

第四行:實體記憶體使用情況

buff/cache:
buffers 和 cache 都是記憶體中存放的資料,不同的是,buffers 存放的是準備寫入磁碟的資料,而 cache 存放的是從磁碟中讀取的資料
在Linux系統中,有一個守護程序(daemon)會定期把buffers中的資料寫入的磁碟,也可以使用 sync 命令手動把buffers中的資料寫入磁碟。使用buffers可以把分散的 I/O 操作集中起來,減少了磁碟尋道的時間和磁碟碎片。
cache是Linux把讀取頻率高的資料,放到記憶體中,減少I/O。Linux中cache沒有固定大小,根據使用情況自動增加或刪除。
第五行:交換區使用情況

Swap(記憶體交換區):
是硬碟上的一塊空間。在記憶體不足的情況下,作業系統把記憶體中不用的資料存到硬碟的交換區,騰出記憶體來讓別的程式執行。因此,開啟swap會一定程度的引起 I/O 效能下降(阿里伺服器預設不開)
第六行:程序詳細資訊

2.死迴圈
構造的程式碼如下:

.
這裡只介紹一下用到的top引數

先手動製造CPU飆高的場景,多執行幾次,小編這裡執行3次

執行top

jstack命令工具可以得到執行緒堆疊資訊,根據這些執行緒堆疊資訊,我們可以去檢查Java程式出現的問題
看到pid為23757的程序CPU佔用較高,執行如下命令

看看pid為23757的程序中執行緒的具體情況


當然你也可以使用互動命令

然後再輸入H,效果和上面一樣
可以看到PID為23772,23773和23774的執行緒佔用CPU較高
這裡可能有人有疑惑,為什麼執行緒也有PID啊?其實執行緒程序都會有自己的ID,這個ID就叫做PID,PID是不特指程序ID,執行緒ID也可以叫做PID
將10進位制的23772轉為16進位制,因為jstack中PID用的是16進位制

開啟loop.txt檔案,搜5cdc

可以看到執行緒一直在執行ShowTopController中的第23行,即

好了定位到程式碼中的位置了,當然生產環境中肯定不會寫一個死迴圈的,有可能在特殊場景下出現死迴圈,或執行一個方法特別慢,用這種方法很快就能找到程式碼位置。
3.死鎖
接著訪問

執行

開啟loop.txt檔案到最後

看到發現一個死鎖,死鎖程式碼的位置描述的很清楚,生產環境發生的死鎖當然沒有這麼簡單,所有學會用這些命令排查還是很有必要的