定位壓測時哪個線程導(dǎo)致cpu比較高

在開發(fā)過程中,有時候我們發(fā)現(xiàn)JVM占用的CPU居高不下宣谈,跟我們的預(yù)期不符愈犹,這時,CPU在做什么呢闻丑?是什么線程讓CPU如此忙碌呢漩怎?我們通過如下幾步,可以查看CPU在執(zhí)行什么線程嗦嗡。

1.查找jvm進(jìn)程ID: jps -lv 或者 ps aux | grep java

2.根據(jù)pid勋锤,查找占用cpu較高的線程:ps -mp <pid> -o THREAD,tid,time | sort -k2r命令查看,后面的sort參數(shù)根據(jù)線程占用的cpu比例進(jìn)行排序:

image.png

3.將tid轉(zhuǎn)換為16進(jìn)制的數(shù)字:printf “%x\n” tid
image.png

4.因為thread id在棧信息中是以十六進(jìn)制的形式顯示的侥祭,因此需要使用 printf "%x \n" <tid> 命令將現(xiàn)場id轉(zhuǎn)成十六進(jìn)制的值叁执,然后執(zhí)行jstack -l <pid> | grep <thread-hex-id> -A 10命令顯示出錯的堆棧信息茄厘,從而定位到具體線程和代碼如下圖:

image.png

jstack:在JDK5開始提供的內(nèi)置工具,可以打印指定進(jìn)程中線程運行的狀態(tài)徒恋,包括線程數(shù)量蚕断、是否存在死鎖欢伏、資源競爭情況和線程的狀態(tài)等等入挣。有下面的幾個常用的參數(shù):

-l 長列表,打印關(guān)于鎖的附加信息
-m 打印java和jni框架的所有棧信息

上面命令中 -A 10參數(shù)用來指定顯示行數(shù)硝拧,否則只會顯示一行信息径筏。

這樣通過上圖,可以很快地定位到程序問題的代碼障陶,然后對代碼進(jìn)行分析和改進(jìn)即可滋恬。注意:需要在多個時間段提出多個 Thread Dump信息,然后綜合進(jìn)行對比分析抱究,單獨分析一個文件是沒有意義的恢氯。
這樣,你就看到CPU這么高鼓寺,是什么線程在搗亂了勋拟!

上面講述了整個的分析過程,不過所有的命令就是實時的妈候,所以最好創(chuàng)建一個shell腳本瞬間執(zhí)行完成:

#!/bin/bash
#
# 當(dāng)JVM占用CPU特別高時敢靡,查看CPU正在做什么
# 可輸入兩個參數(shù):1、pid Java進(jìn)程ID苦银,必須參數(shù)  2啸胧、打印線程ID上下文行數(shù),可選參數(shù)幔虏,默認(rèn)打印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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纺念,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子想括,更是在濱河造成了極大的恐慌柠辞,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件主胧,死亡現(xiàn)場離奇詭異叭首,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)踪栋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門焙格,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夷都,你說我怎么就攤上這事眷唉。” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵冬阳,是天一觀的道長蛤虐。 經(jīng)常有香客問我,道長肝陪,這世上最難降的妖魔是什么驳庭? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮氯窍,結(jié)果婚禮上饲常,老公的妹妹穿的比我還像新娘。我一直安慰自己狼讨,他們只是感情好贝淤,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著政供,像睡著了一般播聪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上布隔,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天离陶,我揣著相機(jī)與錄音,去河邊找鬼执泰。 笑死枕磁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的术吝。 我是一名探鬼主播计济,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼排苍!你這毒婦竟也來了沦寂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤淘衙,失蹤者是張志新(化名)和其女友劉穎传藏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彤守,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡毯侦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了具垫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侈离。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖筝蚕,靈堂內(nèi)的尸體忽然破棺而出卦碾,到底是詐尸還是另有隱情铺坞,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布洲胖,位于F島的核電站济榨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏绿映。R本人自食惡果不足惜擒滑,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绘梦。 院中可真熱鬧橘忱,春花似錦赴魁、人聲如沸卸奉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榄棵。三九已至,卻和暖如春潘拱,著一層夾襖步出監(jiān)牢的瞬間疹鳄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工芦岂, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留瘪弓,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓禽最,卻偏偏與公主長得像腺怯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子川无,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容