【JVM性能调优】使用jstack找出最耗CPU的java线程

jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体的代码,所以它在JVM性能调优中很常见。下面我们在找出某个java进程中最耗CPU的线程,并定位堆栈信息,使用到的命令有:ps、top、printf、jstack、grep。

1、使用top -c命令查看占用CPU最高的java进程

#top -c

这里写图片描述

2、查看CPU占用最高的线程

1#top -Hp 9179 -d 1 -n 12#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" 9224

这里写图片描述

4、打印占用CPU最高的java线程9224的堆栈信息

1#jstack 9224 > /root/mss/dump.txt2#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;
do
        nid=$(echo "$line"|awk '{printf("0x%x",$1)}')
        cpu=$(echo "$line"|awk '{print $2}')
        echo "nid: $nid, cpu: $cpu %">>$sfile
        lines=`grep $nid -A 100 $tfile |grep -n '^$'|head -1|awk -F':' '{print $1}'`
        ((lines=$lines-1))
        if [ "$lines" = "-1" ];
        then
             grep $nid -A 100 $tfile  >>$sfile
             echo '' >>$sfile
        else
             grep $nid -A $lines $tfile  >>$sfile
        fi
done
rm -f $tfile
echo "read msg in $sfile"
###########  end  ############

需要注意的是pid的获取依然需要多ps查找一次,建议pid的获取方式可以改为:

ps -ef|grep 你程序的关键字|grep -v 'grep'|awk '{print $2}'
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值