Linux中使用Shell脚本查看Java线程的CPU使用情况
线上Java应用,在业务高峰期的时候经常出现CPU跑高,需要查看实时的线程占用cpu情况,下面是一个很好用的脚本,可以快速导出每个线程的占用CPU情况,结合jstack日志,排查到具体的线程类名。
一、首先获得jvm的进程ID:
ps-ef|grepjava tomcat 374 372 111:45? 00:02:30jsvc.exec-java-home/usr/java/latest-usertomcat-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/temporg.apache.catalina.startup.Bootstrap
如上,我们知道PID为374,切换使用tomcat用户登录
vijkiller.sh输入以下脚本:
#!/bin/sh
exportLANG="zh_CN.UTF-8"; exportLC_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}-oTHREAD,tid,time|sort-rn>${LOG_FILE}; jstack${PID}>${JSTACK_FILE};
forLINEin`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-A10"0x${XPID}"${JSTACK_FILE}; echo-e"\e[0m"; done;