欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

Linux中使用Shell脚本查看Java线程的CPU使用情况

程序员文章站 2023-11-22 10:24:52
线上java应用,在业务高峰期的时候经常出现cpu跑高,需要查看实时的线程占用cpu情况,下面是一个很好用的脚本,可以快速导出每个线程的占用cpu情况,结合jstack日志...

线上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;

执行该脚本:

复制代码 代码如下:
./jkiller.sh 374

该脚本将生成一个/tmp/jkiller.log 文件,里面为各个线程的cpu使用情况,里面带有tid,为线程id,可以结合/tmp/jstack.log 文件,查看具体是某个线程.