检测最耗cpu的线程的脚本

这个脚本用于定位出当前java进程里最耗cpu的那个线程,给出cpu的占用率和当前堆栈信息。这个脚本仅限于linux上,我没有找到在mac下定位线程使用cpu情况的工具,如果你知道请告诉我一下。

先模拟一个耗cpu的java进程,启动一个scala的repl并在上面跑一段死循环:

scala> while(true) {}

脚本执行效果:

$ ./busythread.sh `pidof java`tid: 431  cpu: %98.8"main" prio=10 tid=0x00007f777800a000 nid=0x1af runnable [0x00007f7781c2e000]    java.lang.Thread.State: RUNNABLE    at $line3.$read$$iw$$iw$.(:8)    at $line3.$read$$iw$$iw$.()    at $line3.$eval$.$print$lzycompute(:7)    - locked  (a $line3.$eval$)    at $line3.$eval$.$print(:6)    at $line3.$eval.$print()    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    at java.lang.reflect.Method.invoke(Method.java:606)    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:739)    at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:986)    at scala.tools.nsc.interpreter.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:593)    at scala.tools.nsc.interpreter.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:592)    at scala.reflect.internal.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:31)    at scala.reflect.internal.util.AbstractFileClassLoader.asContext(AbstractFileClassLoader.scala:19)    at scala.tools.nsc.interpreter.IMain$WrappedRequest.loadAndRunReq(IMain.scala:592)    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:524)    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:520)

脚本内容:

#!/bin/bashif [ $# -eq 0 ];then    echo "please enter java pid"    exit -1fipid=$1jstack_cmd=""if [[ $JAVA_HOME != "" ]]; then    jstack_cmd="$JAVA_HOME/bin/jstack"else    r=`which jstack 2>/dev/null`    if [[ $r != "" ]]; then        jstack_cmd=$r    else        echo "can not find jstack"        exit -2    fifi#line=`top -H  -o %CPU -b -n 1  -p $pid | sed '1,/^$/d' | grep -v $pid | awk 'NR==2'`line=`top -H -b -n 1 -p $pid | sed '1,/^$/d' | sed '1d;/^$/d' | grep -v $pid | sort -nrk9 | head -1`echo "$line" | awk '{print "tid: "$1," cpu: %"$9}'tid_0x=`printf "%0x" $(echo "$line" | awk '{print $1}')`$jstack_cmd $pid | grep $tid_0x -A20 | sed -n '1,/^$/p'

脚本已放到服务器上,可以通过下面的方式执行:

$ bash <(curl -s http://hongjiang.info/busythread.sh)  java_pid

update: 感谢容若的反馈,很多环境的procps版本较低,top还不支持-o参数,排序那块用sort解决了,脚本已更新。

检测最耗cpu的线程的脚本

相关文章:

你感兴趣的文章:

标签云: