Linux中使用Shell脚本查看Java线程的CPU使用情况
线上java应用,在业务高峰期的时候经常出现cpu跑高,需要查看实时的线程占用cpu情况,下面是一个很好用的脚本,可以快速导出每个线程的占用cpu情况,结合jstack日志,排查到具体的线程类名。
一、首先获得jvm的进程id:
ps -ef|grep java
tomcat 374 372 1 11:45 ? 00:02:30 jsvc.exec -java-home /usr/java/latest -user tomcat -pidfile /usr/local/tomcat7/logs/tomcat7.pid -outfile /usr/local/tomcat7/logs/catalina-daemon.out -errfile &1 -classpath /usr/local/tomcat7/bin/bootstrap.jar:/usr/local/tomcat7/bin/commons-daemon.jar:/usr/local/tomcat7/bin/tomcat-juli.jar -djava.util.logging.config.file=/usr/local/tomcat7/conf/logging.properties -djava.awt.headless=true -xmx10240m -xx:maxpermsize=2096m -djava.util.logging.manager=org.apache.juli.classloaderlogmanager -djava.endorsed.dirs=/usr/local/tomcat7/endorsed -dcatalina.base=/usr/local/tomcat7 -dcatalina.home=/usr/local/tomcat7 -djava.io.tmpdir=/usr/local/tomcat7/temp org.apache.catalina.startup.bootstrap
如上,我们知道pid为374,切换使用tomcat用户登录
vi jkiller.sh 输入以下脚本:
#!/bin/sh
export lang="zh_cn.utf-8";
export lc_all="zh_cn.utf-8";
log_file="/tmp/jkiller.log";
jstack_file="/tmp/jstack.log";
pid="$1";
shift;
i=0;
j="$1";
if [ -z "${j}" ]; then
j=5;
fi
ps -mp ${pid} -o thread,tid,time | sort -rn > ${log_file};
jstack ${pid} > ${jstack_file};
for line in `cat ${log_file}|gawk -f '-' '{print $4}'|gawk -f ' ' '{print $1}'`
do
i=$(($i+1));
if (($i>$j)); then
break;
fi;
xpid=`printf "%x\n" ${line}`;
echo -ne "\033[32m";
echo ${xpid};
echo -e "\033[34m";
grep -a 10 "0x${xpid}" ${jstack_file};
echo -e "\e[0m";
done;
执行该脚本:
该脚本将生成一个/tmp/jkiller.log 文件,里面为各个线程的cpu使用情况,里面带有tid,为线程id,可以结合/tmp/jstack.log 文件,查看具体是某个线程.
上一篇: bash脚本中if语句的使用方法
下一篇: shell获取命令行参数示例分享