找出耗CPU的java线程脚本-优化版

本文介绍如何通过优化的脚本快速定位Java进程中消耗CPU的线程,包括三个步骤,并分享了一个调整后的脚本,提高线上问题排查效率。脚本中,pid的获取建议通过ps命令结合关键字进行筛选。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查找java进程中耗CPU的线程,分为以下三步:

1.列出进程id对应的线程id
ps -mp {pid} -o THREAD,tid,time

2.cpu占用高的线程id找出并转换为16进制
printf “%x\n” {tid}

3.打印出有问题的线程
jstack {pid} |grep {tid} -A 30

这样的方式有个问题,每次查问题需要多次输入,且每次只能找到一个线程栈信息,效率比较低。因此就有人将其制作成脚本,方便线上更快速的定位问题。以下是根据高人脚本稍微调整后的脚本,线上使用效果还不错,这里做个记录:

###### 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}'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值