1.線上CPU飆高排查思路
一般常見的原因主要是:
①死循環(huán)(while / 遞歸 / for循環(huán)相關(guān)等 )②鎖相關(guān)引發(fā)( CAS自旋鎖過多 / 線程死鎖 / 數(shù)據(jù)庫死鎖引發(fā)程序 )
③線程阻塞 / 網(wǎng)絡(luò)IO (遠(yuǎn)程調(diào)用阻塞線程不能釋放 / 持續(xù)任務(wù)超時等待 )
/或者數(shù)據(jù)庫連接并發(fā)數(shù)資源耗盡④JAVA程序頻繁FULL GC(大量對象被引用,無法及時進(jìn)行垃圾回收等)
/ 未合理分配新生代和老年代的比例導(dǎo)致
/ 或者服務(wù)器CPU/內(nèi)存等資源無法支撐線上程序運(yùn)行
/ 頻繁創(chuàng)建超大類型對象或者上傳文件過大過多導(dǎo)致內(nèi)存耗盡
1.先使用TOP命令查看占用CPU比較高的進(jìn)程,執(zhí)行top命令,查看所有進(jìn)程占系統(tǒng)CPU的排序

2.然后用 top -H -p pid 來找到cpu使用率比較高的線程
3.控制臺執(zhí)行 printf '0x%x' tid 線程 id 二進(jìn)制轉(zhuǎn)化 成16 進(jìn)制
4.使用 jstack pid | grep tid 找到線程堆棧 (tid為步驟3得到的結(jié)果)
2.阿里巴巴開源診斷工具 arthas
# 執(zhí)行以下命令,下載arthas運(yùn)行jar包
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
# 如果Linux未配置Java環(huán)境變量 可以使用使用 whereis java查找bin路徑,指定路徑執(zhí)行
# 例如: /usr/bin/java -jar arthas-boot.jar
啟動成功如圖:

3.使用開源工具 show-busy-java-threads (需要下載)
# 主要功能:
show-busy-java-threads
1.從所有運(yùn)行的Java進(jìn)程中找出(5個缺?。┳钕腃PU的線程,打印線程棧信息
2.缺省會自動從所有的Java進(jìn)程中找出最消耗CPU的線程,這樣用更方便
3.手動指定分析的Java進(jìn)程Id,以保證只會顯示單個Java進(jìn)程的信息
show-busy-java-threads -p <指定的Java進(jìn)程Id>
show-busy-java-threads -c <要顯示的線程棧數(shù)>
具體使用參考一下執(zhí)行語句,逐條執(zhí)行即可
命令獲?。?wget --no-check-certificate https://raw.github.com/oldratlee/useful-scripts/release-2.x/bin/show-busy-java-threads
下載完畢之后賦予執(zhí)行權(quán)限
chmod +x show-busy-java-threads
開始執(zhí)行
./show-busy-java-threads
執(zhí)行下載


運(yùn)行結(jié)果如圖:

