java线程检查,使用top检查Linux中的Java线程

这可能有点旧,但这就是我所做的有点将top和jstack合并在一起。我使用了两个脚本,但我确信这一切都可以在一个脚本中完成。

首先,我将带有我的java线程的pids的top输出保存到文件中,并将jstack输出保存到另一个文件中:

#!/bin/sh

top -H -b -n 1 | grep java > /tmp/top.log

jstack -l `ps fax | grep java | grep tomcat | sed "s/ *\([0-9]*\) .*/\1/g"` > /tmp/jstack.log然后我使用perl脚本来调用bash脚本(这里称为cpu-java.sh)并且有点合并两个文件(/tmp/top.log和/tmp/jstack.log):

#!/usr/bin/perl

system("sh cpu-java.sh");

open LOG, "/tmp/top.log" or die $!;

print "PID\tCPU\tMem\tJStack Info\n";

while ($l = ) {

$pid = $l;

$pid =~ s/root.*//g;

$pid =~ s/ *//g;

$hex_pid = sprintf("%#x", $pid);

@values = split(/\s{2,}/, $l);

$pct = $values[4];

$mem = $values[5];

open JSTACK, "/tmp/jstack.log" or die $!;

while ($j = ){

if ($j =~ /.*nid=.*/){

if ($j =~ /.*$hex_pid.*/){

$j =~ s/\n//;

$pid =~ s/\n//;

print $pid . "\t" . $pct . "\t" . $mem . "\t" . $j . "\n";

}

}

}

close JSTACK;

}

close LOG;输出帮助我找出哪些线程占用我的CPU:

PID CPU Mem JStack Info

22460 0 8.0 "main" prio=10 tid=0x083cb800 nid=0x57bc runnable [0xb6acc000]

22461 0 8.0 "GC task thread#0 (ParallelGC)" prio=10 tid=0x083d2c00 nid=0x57bd runnable

22462 0 8.0 "GC task thread#1 (ParallelGC)" prio=10 tid=0x083d4000 nid=0x57be runnable

22463 0 8.0 "GC task thread#2 (ParallelGC)" prio=10 tid=0x083d5800 nid=0x57bf runnable

22464 0 8.0 "GC task thread#3 (ParallelGC)" prio=10 tid=0x083d7000 nid=0x57c0 runnable

...然后我可以回到/tmp/jstack.log并查看有问题的线程的堆栈跟踪,并尝试弄清楚从那里发生了什么。当然这个解决方案依赖于平台,但它应该适用于* nix的大多数风格和一些调整。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值