在開發(fā)過程中费薄,有時候我們發(fā)現(xiàn)JVM占用的CPU居高不下,跟我們的預(yù)期不符栖雾,這時楞抡,CPU在做什么呢?是什么線程讓CPU如此忙碌呢岩灭?我們通過如下幾步拌倍,可以查看CPU在執(zhí)行什么線程。
1.查找jvm進程ID: jps -lv 或者 ps aux | grep java
2.根據(jù)pid噪径,查找占用cpu較高的線程:ps -mp pid -o THREAD,tid,time 如圖所示:找到占用cpu最高的tid (可以使用sort命令排序:sort -k 3 -r -n)
3.將tid轉(zhuǎn)換為16進制的數(shù)字:printf “%x\n” tid
4.使用jstack命令柱恤,查詢線程信息,從而定位到具體線程和代碼:jstack pid | grep 7ccd -A 30
這樣找爱,你就看到CPU這么高梗顺,是什么線程在搗亂了!
怎么樣车摄,是不是覺得有點兒麻煩寺谤,沒有關(guān)系,我把這幾個步驟寫成了一個腳本吮播,直接使用就OK了变屁。
#!/bin/bash
#
# 當(dāng)JVM占用CPU特別高時,查看CPU正在做什么
# 可輸入兩個參數(shù):1意狠、pid Java進程ID粟关,必須參數(shù) 2、打印線程ID上下文行數(shù)环戈,可選參數(shù)闷板,默認打印10行
#
pid=$1
if test -z $pid
then
echo "pid can not be null!"
exit
else
echo "checking pid($pid)"
fi
if test -z "$(jps -l | cut -d '' -f 1 | grep $pid)"
then
echo "process of $pid is not exists"
exit
fi
lineNum=$2
if test -z $lineNum
then
$lineNum=10
fi
jstack $pid >> "$pid".bak
ps -mp $pid -o THREAD,tid,time | sort -k2r | awk '{if ($1 !="USER" && $2 != "0.0" && $8 !="-") print $8;}' | xargs printf "%x\n" >> "$pid".tmp
tidArray="$( cat $pid.tmp)"
for tid in $tidArray
do
echo "******************************************************************* ThreadId=$tid **************************************************************************"
cat "$pid".bak | grep $tid -A $lineNum
done
rm -rf $pid.bak
rm -rf $pid.tmp
相關(guān)閱讀:
本文首發(fā)在 劉振鋒的簡書博客 原文地址為《當(dāng)CPU飆高時,它在做什么》轉(zhuǎn)載請注明院塞!