检测最耗cpu的线程的脚本
2015-06-24 21:54
375 查看
这个脚本用于定位出当前java进程里最耗cpu的那个线程,给出cpu的占用率和当前堆栈信息。这个脚本仅限于linux上,我没有找到在mac下定位线程使用cpu情况的工具,如果你知道请告诉我一下。
先模拟一个耗cpu的java进程,启动一个scala的repl并在上面跑一段死循环:
脚本执行效果:
脚本内容:
脚本已放到服务器上,可以通过下面的方式执行:
update: 感谢容若的反馈,很多环境的procps版本较低,top还不支持-o参数,排序那块用sort解决了,脚本已更新。
http://hongjiang.info/find-busiest-thread-of-java/
先模拟一个耗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$.<init>(<console>:8) at $line3.$read$$iw$$iw$.<clinit>(<console>) at $line3.$eval$.$print$lzycompute(<console>:7) - locked <0x00000000fc201758> (a $line3.$eval$) at $line3.$eval$.$print(<console>:6) at $line3.$eval.$print(<console>) 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/bash if [ $# -eq 0 ];then echo "please enter java pid" exit -1 fi pid=$1 jstack_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 fi fi #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解决了,脚本已更新。
http://hongjiang.info/find-busiest-thread-of-java/
相关文章推荐
- Hibernate4.3.x Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
- 1037. Magic Coupon (25)
- 为了自己,为了家庭!!!
- POJ 2778 DNA Sequence(AC自动机+矩阵快速幂)
- ConfidenceScorer API
- ConfidenceResult API
- c/c++的函数参数压栈顺序
- redis文档翻译_LRU缓存
- 【mvc学习】给小白们的第一个MVC学习Demo之Login篇
- cpu高负载解决思路
- AbstractSausageMaker API
- IPV4的几个内核安全管理功能
- 零散知识:字节数&CAD图形刷洗&面向对象
- HTTP状态代码表
- JavaWeb前端
- Java 死锁的个人尝试和理解
- Mysql常用操作
- iscsi 怎么搞
- 深入解析Windows操作系统之总体架构
- 格式化jd-gui反编译源码的行号