java dump 线程_linux下dump耗CPU的java线程

经常发现系统load值高,然后想去查找具体是哪个java线程导致的,一般会使用top  jstack等等,但是每次都是人肉操作,故希望能将这个过程自动化,故这里写了个脚本用于dump出当前耗cpu的java线程堆栈。

分析下脚本处理过程:

1:利用top H列出当前线程的情况

2:grep出线程id

3:转换为jstack中的十六进制的线程id

4:利用jstack dump出线程

5:grep出所需要的线程上下文

直接上脚本代码

top -b -H -n 1 -p $1 | fgrep java -m $2 | awk '{print "obase=16;"$1}' | bc | awk '{printf"nid=0x%s|",$0}'| awk '{print substr($0,1,length()-1)}' > /tmp/nid.log 2>&1 &

/opt/sun/java/bin/jstack -l $1 > /tmp/js.log 2>&1 &

wait

cat /tmp/nid.log && cat /tmp/nid.log |xargs -i egrep {} /tmp/js.log -A 10 -i

本想借助管道一个命令完全实现的,发现grep如果接受2个动态参数行不通,故拆分开用2个进程来做的

说明下使用方式

sh  topJava.sh  pid  threadNum

topJava.sh :是这个脚本的名字

pid :是要监控的java进程的id,其实如果只有一个java进程,那我可以用另外神奇的命令帮你获得,不过为了通用还是当成参数了。

threadNum :是要监控的java线程的个数,例如我想看最耗cpu的5个线程,则传递5

这里完全是用shell脚本来实现的,当然也可以完全用java的方式实现,不过java实现起来没这么简单要用MBean还有jvm tools相关的类,写一坨代码做shell的事情划不来。

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2011-09-27 13:27

浏览 3985

评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值