java面試應(yīng)用上線后Cpu使用率飆升如何排查
引言
上次面試官問了個(gè)問題:應(yīng)用上線后Cpu使用率飆升如何排查?
其實(shí)這是個(gè)很常見的問題,也非常簡(jiǎn)單,那既然如此我為什么還要寫呢?因?yàn)樯洗位卮鸬臅r(shí)候我忘記將線程PID轉(zhuǎn)換成16進(jìn)制的命令了。
所以我決定再重溫一遍這個(gè)問題,當(dāng)然貼心的我還給大家準(zhǔn)備好了測(cè)試代碼,大家可以實(shí)際操作一下,這樣下次就不會(huì)忘記了。
模擬一個(gè)高CPU場(chǎng)景
public class HighCpuTest { public static void main(String[] args) { List<HignCpu> cpus = new ArrayList<>(); Thread highCpuThread = new Thread(()->{ int i = 0; while (true){ HignCpu cpu = new HignCpu("Java日知錄",i); cpus.add(cpu); System.out.println("high cpu size:" + cpus.size()); i ++; } }); highCpuThread.setName("HignCpu"); highCpuThread.start(); } }
在main方法中開啟了一個(gè)線程,無限構(gòu)建HighCpu
對(duì)象。
@Data @AllArgsConstructor public class HignCpu { private String name; private int age; }
準(zhǔn)備好上面的代碼,運(yùn)行HighCpuTest,然后就可以開始一些列的操作來發(fā)現(xiàn)問題原因了。
排查步驟
第一步,使用 top 找到占用 CPU 最高的 Java 進(jìn)程
1. 監(jiān)控cpu運(yùn)行狀,顯示進(jìn)程運(yùn)行信息列表
top -c
2. 按CPU使用率排序,鍵入大寫的P
P
第二步,用 top -Hp 命令查看占用 CPU 最高的線程
上一步用 top
命令找到了那個(gè) Java 進(jìn)程。那一個(gè)進(jìn)程中有那么多線程,不可能所有線程都一直占著 CPU 不放,這一步要做的就是揪出這個(gè)罪魁禍?zhǔn)?,?dāng)然有可能不止一個(gè)。
執(zhí)行top -Hp pid
命令,pid 就是前面的 Java 進(jìn)程,我這個(gè)例子中就是 16738
,完整命令為:
top -Hp 16738
,然后鍵入P (大寫p),線程按照CPU使用率排序
執(zhí)行之后的效果如下
查到占用CPU最高的那個(gè)線程 PID 為 16756
第三步,查看堆棧信息,定位對(duì)應(yīng)代碼
通過printf命令將其轉(zhuǎn)化成16進(jìn)制,之所以需要轉(zhuǎn)化為16進(jìn)制,是因?yàn)槎褩@?,線程id是用16進(jìn)制表示的。(我當(dāng)時(shí)就是忘記這個(gè)命令了~)
[root@review-dev ~]# printf "%x\n" 16756 4174
得到16進(jìn)制的線程ID為4174。
通過jstack命令查看堆棧信息
jstack 16738 | grep '0x4174' -C10 --color
如上圖,找到了耗CPU高的線程對(duì)應(yīng)的線程名稱“HighCpu”,以及看到了該線程正在執(zhí)行代碼的堆棧。
最后,根據(jù)堆棧里的信息,定位到對(duì)應(yīng)死循環(huán)代碼,搞定。
小結(jié)
cpu使用率飆升后如何排查這個(gè)問題不僅面試中經(jīng)常會(huì)問,而且在實(shí)際工作中也非常有用,大家最好根據(jù)上述步驟實(shí)際操作一下,這樣才能記得住記得牢。
以上就是java面試應(yīng)用上線后Cpu使用率飆升如何排查的詳細(xì)內(nèi)容,更多關(guān)于java Cpu使用率飆升排查的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mybatis中傳遞多個(gè)參數(shù)的4種方法總結(jié)
這篇文章主要給大家介紹了關(guān)于Mybatis中傳遞多個(gè)參數(shù)的4種方法,并且介紹了關(guān)于使用Mapper接口時(shí)參數(shù)傳遞方式,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法
java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法,需要的朋友可以參考一下2013-03-03Java實(shí)現(xiàn)的求解經(jīng)典羅馬數(shù)字和阿拉伯?dāng)?shù)字相互轉(zhuǎn)換問題示例
這篇文章主要介紹了Java實(shí)現(xiàn)的求解經(jīng)典羅馬數(shù)字和阿拉伯?dāng)?shù)字相互轉(zhuǎn)換問題,涉及java輸入輸出及字符串、數(shù)組的遍歷與轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2018-04-04HashMap的get()方法的NullPointerException問題
這篇文章主要介紹了HashMap的get()方法的NullPointerException問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09淺析Java中關(guān)鍵詞volatile底層的實(shí)現(xiàn)原理
在 Java 并發(fā)編程中,有 3 個(gè)最常用的關(guān)鍵字:synchronized、ReentrantLock 和 volatile,這篇文章主要來和大家聊聊volatile底層的實(shí)現(xiàn)原理,感興趣的可以了解下2024-02-02springboot集成@DS注解實(shí)現(xiàn)數(shù)據(jù)源切換的方法示例
本文主要介紹了springboot集成@DS注解實(shí)現(xiàn)數(shù)據(jù)源切換的方法示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Java面試題沖刺第十九天--數(shù)據(jù)庫(4)
這篇文章主要為大家分享了最有價(jià)值的三道關(guān)于數(shù)據(jù)庫的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下2021-08-08簡(jiǎn)單分析Java線程編程中ThreadLocal類的使用
這篇文章主要介紹了Java線程編程中ThreadLocal類的使用,包括使用其對(duì)共享變量的操作的分析,需要的朋友可以參考下2015-12-12