1囤踩、簡(jiǎn)述
??當(dāng)程序中出現(xiàn)死循環(huán),或者計(jì)算量很大的線程的時(shí)候晓褪,就會(huì)導(dǎo)致Java程序進(jìn)程占用大量CPU資源堵漱,從而可能導(dǎo)致程序掛掉,此文從實(shí)例進(jìn)行概述具體的查詢占用CPU資源高的程序代碼涣仿。
2勤庐、排查步驟
(1)查看占用CPU高的進(jìn)程
- top命令
(2)查看進(jìn)程中占用CPU最多的線程。
- top -Hp ${pid} 命令(PID表示進(jìn)程ID,排列靠前的幾個(gè)基本都是此進(jìn)程下最占用CPU資源的線程)
(3)將進(jìn)程信息轉(zhuǎn)出到文件埃元。
- jstack -l
{file.log}
(4)將線程ID轉(zhuǎn)成16進(jìn)制涝涤。
- printf ‘%x\n’ ${TID} 命令(TID表示線程ID)
(5)根據(jù)16進(jìn)制線程ID在3中輸出的file.log中找到對(duì)應(yīng)線程的息更具體代碼信息。
3岛杀、示例
3.1阔拳、示例代碼
??寫一個(gè)死循環(huán),來模仿占用CPU資源类嗤,然后進(jìn)行問題排查糊肠。
public class CPUTestDemo {
public static void main(String[] args) {
int i = 0;
while (true) {
i++;
}
}
}
3.2、排查
1遗锣、top命令查看當(dāng)前占用CPU資源最高的進(jìn)程货裹,如下圖:
??從圖中可以看出進(jìn)程5278所占用的CPU資源99.5%,并且從COMMAND能看出確實(shí)是啟動(dòng)的Java進(jìn)程精偿,說明Java程序中存在問題弧圆,導(dǎo)致狂占CPU資源。
2笔咽、對(duì)1中得到的占用CPU資源高的進(jìn)程執(zhí)行top -Hp 5278搔预,得到此Java進(jìn)程內(nèi)最占用CPU資源的線程,如下圖:
??從圖中可以看出線程5279所占用的CPU資源99.6%叶组,這就可以明確的定位到Java程序中占用CPU資源的線程號(hào)5279拯田。
3、對(duì)2中得到的占用CPU資源高的線程號(hào)執(zhí)行printf ‘%x\n’ 5279甩十,得到線程號(hào)的十六進(jìn)制值149f船庇,如下圖:
4、通過jstack -l 5278 > file.log 重定向輸出Java進(jìn)程的jstack日志侣监。
5鸭轮、通過對(duì)3中得到的線程十六進(jìn)制值,在4)的file.log中查找線程中具體的占用CPU資源的代碼信息橄霉,如下圖:
??從圖中可以看出線程0x149f主線程中具體的占用CPU資源的代碼行张弛,定位到文字開始的實(shí)例代碼,可以看到正常程序中的while死循環(huán)造成的CPU資源占用過高酪劫,從而定位代碼問題吞鸭。