不知道在你們面試中,有沒有遇到這個問題java
生產服務器上部署了幾個java程序,忽然出現了CPU100%的異常告警,你如何定位出問題呢?linux
這個問題分爲兩版回答!
高調版
對不起,我是作研發的,這個問題在生產上是不可能碰見的!由於研發是不可能直接操做生產服務器,若是貴公司研發能遇到這個問題,應該要反思一下本身的權限控制是否合理!面試
面試官內心活動
:裝13是否是,趕忙走!windows
低調版
這個問題我在生產上沒碰到過,由於咱們是無法直接操做生產環境的。只能說,在測試環境曾經碰見過。操做步驟以下,balabala...服務器
面試官內心活動
:權限控制的不錯,應該是在大廠呆過。dom
下面開始咱們的正文工具
下面給出兩種系統環節下的排查步驟,都是如出一轍的,只是命令稍有區別!測試
準備一行死循環代碼線程
public class TestFor { public static void main(String[] args) { int random = 0; while (random < 100) { random = random * 10; } } }
怎麼跑,應該不用我說了,直接教你們怎麼查!code
可能有人有疑問,我爲何要說Windows
版的!由於,我曾經給不少政府部門作過系統。我發現他們用的是Windows Server
,不是Linux
系統。全部必要說一下!
手邊沒有Windows Server
機器,我以Win 10
爲例,截圖給你們看一下,先調出PID
顯示項!
而後發現進程PID
以下圖所示,爲10856
接下來呢
這裏用到微軟的工具Process Explorer v16.22,地址以下
https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer
如圖所示
發現最耗Cpu
的線程的TID
爲6616
這是十進制的數據,轉成十六進制爲0x19d8
執行命令
jstack -l 10856 > c:/10856.stack
打開文件c:/10856.stack
,搜索19d8
,以下圖所示
根據文件就能夠看出,咱們的TestFor.java
文件第七行一直在跑,至此定位到問題
Linux版本,步驟是如出一轍的,就是命令換了一下
執行命令
top -c
,顯示進程運行信息列表。按下P,進程按照Cpu使用率排序以下圖所示,PID
爲3033
的進程耗費Cpu
最高
執行命令
top -Hp 3033
,顯示一個進程的線程運行信息列表。按下P,進程按照Cpu使用率排序以下圖所示,PID
爲3034
的線程耗費Cpu最高
這是十進制的數據,轉成十六進制爲0Xbda
jstack -l 3033 > ./3033.stack
而後執行,grep命令,看線程0xbda
作了什麼
cat 3033.stack |grep 'bda' -C 8
輸出以下
至此定位到問題
你們記得必定要去實際操做一次!