当CPU飙高时,它在做什么

举报
Tracy 发表于 2019/11/04 15:26:27 2019/11/04
【摘要】 在开发过程中,有时候我们发现JVM占用的CPU居高不下,跟我们的预期不符,这时,CPU在做什么呢?是什么线程让CPU如此忙碌呢?我们通过如下几步,可以查看CPU在执行什么线程。1.查找jvm进程ID: jps -lv 或者 ps aux | grep java2.根据pid,查找占用cpu较高的线程:ps -mp pid -o THREAD,tid,time 如图所示:找到占用cpu最高的...

在开发过程中,有时候我们发现JVM占用的CPU居高不下,跟我们的预期不符,这时,CPU在做什么呢?是什么线程让CPU如此忙碌呢?我们通过如下几步,可以查看CPU在执行什么线程。

1.查找jvm进程ID: jps -lv 或者 ps aux | grep java

2.根据pid,查找占用cpu较高的线程:ps -mp pid  -o THREAD,tid,time 如图所示:找到占用cpu最高的tid (可以使用sort命令排序:sort -k 3 -r -n)


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1



3.将tid转换为16进制的数字:printf “%x\n” tid



4.使用jstack命令,查询线程信息,从而定位到具体线程和代码:jstack pid | grep 7ccd -A 30



这样,你就看到CPU这么高,是什么线程在捣乱了!

怎么样,是不是觉得有点儿麻烦,没有关系,我把这几个步骤写成了一个脚本,直接使用就OK了。


#!/bin/bash
#
# 当JVM占用CPU特别高时,查看CPU正在做什么
# 可输入两个参数:1、pid Java进程ID,必须参数  2、打印线程ID上下文行数,可选参数,默认打印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




-更多文章-


大数据就业前景,分析的太到位了!

阿里分布式事务框架GTS开源了!

SpringCloud随笔:记录在使用OAuth2遇到的巨坑


-关注我-

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


转载声明:本文转载自公众号【方志朋】。

原文链接:

https://mp.weixin.qq.com/s?__biz=MzAxNjk4ODE4OQ==&mid=2247484955&idx=1&sn=d7c7e006f61f417525df4ffd3a99b523&chksm=9bed2769ac9aae7f2d6795fa5aeeabd2eeea3c8b97248b37c2790a48d6d31599b02fd8c35801&scene=21#wechat_redirect

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。