【JVM性能调优】使用jstack找出最耗CPU的java线程
生活随笔
收集整理的這篇文章主要介紹了
【JVM性能调优】使用jstack找出最耗CPU的java线程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
jstack可以定位到線程堆棧,根據堆棧信息我們可以定位到具體的代碼,所以它在JVM性能調優中很常見。下面我們在找出某個java進程中最耗CPU的線程,并定位堆棧信息,使用到的命令有:ps、top、printf、jstack、grep。
1、使用top -c命令查看占用CPU最高的java進程
#top -c2、查看CPU占用最高的線程
(1)#top -Hp 9179 -d 1 -n 1 (2)#ps -Lfp pid (3)#ps -mp pid -o THREAD,tid,time使用第一個輸出如下:(time列就是各個java線程耗費的CPU時間)
PS:top命令參數說明:
-p PID:僅監視指定進程的ID,PID是進程號;
-c:顯示命令行,而不僅僅是命令名
-h:當系統有多個CPU時,個別CPU的狀態信息被隱藏,只顯示平均狀態值
-d N:顯示兩次刷新時間的間隔,比如:-d 5,表示兩次刷新時間間隔為5秒;
3、占用CPU最高的線程9179換算成16進制到文檔中尋找對象應線程
#printf "%x\n" 92244、打印占用CPU最高的java線程9224的堆棧信息
(1)#jstack 9224 > /root/mss/dump.txt (2)#jstack 9179 | grep 2408n使用第二個,用來輸出進程9179的堆棧信息,然后根據線程ID的十六進制值grep,如下:
"PollIntervalRetrySchedulerThread" prio=10 tid=0x00007f950043e000 nid=0x54ee in Object.wait()可以看到CPU消耗在PollIntervalRetrySchedulerThread這個類的Object.wait()這個方法。
有一個方便的定位腳本如下:
###### begin pid為86295的java進程中cpu>0的線程的堆棧###### pid=86295 sfile="/tmp/java.$pid.trace" tfile="/tmp/java.$pid.trace.tmp" rm -f $sfile $tfile echo "pid $pid"jstack $pid > $tfile ps -mp $pid -o THREAD,tid,time|awk '{if ($2>0 && $8 != "-") print $8,$2}'|while read line; donid=$(echo "$line"|awk '{printf("0x%x",$1)}')cpu=$(echo "$line"|awk '{print $2}')echo "nid: $nid, cpu: $cpu %">>$sfilelines=`grep $nid -A 100 $tfile |grep -n '^$'|head -1|awk -F':' '{print $1}'`((lines=$lines-1))if [ "$lines" = "-1" ];thengrep $nid -A 100 $tfile >>$sfileecho '' >>$sfileelsegrep $nid -A $lines $tfile >>$sfilefi done rm -f $tfile echo "read msg in $sfile" ########### end ############需要注意的是pid的獲取依然需要多ps查找一次,建議pid的獲取方式可以改為:
ps -ef|grep 你程序的關鍵字|grep -v 'grep'|awk '{print $2}' 超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的【JVM性能调优】使用jstack找出最耗CPU的java线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【redismemcached】数据类型
- 下一篇: java.io.IOException: