找到最耗CPU的java线程

 

 

找到最耗CPU的java线程

1 找出占用cpu过高的进程ID号

   命令: top -c
   找到最耗CPU的java线程_第1张图片
 

 

 

 2 找出该进程下,运行时间过长的进程 id号.

     命令:ps -mp 10024 -o THREAD,tid,time | sort -rn


  找到最耗CPU的java线程_第2张图片
 

 

 3 因为在java堆栈日志中,线程id以 16 进程存储,因此我们需要先把 10 进制的线程id,转为 16 进制.

   命令:printf "%x\n" 11490
 
 

 

4 通过 jdk自带的jstack工具,打印堆栈异常信息.

   通过 printf "%x\n" 30834 首先转化成16进制, 继续通过jstack命令dump出当前的jvm进程的堆栈信息。 通过Grep命令即可以查到对应16进制的线程id信息,很快就可以找到对应最耗CPU的代码快在哪。

   命令:sudo ./jstack 10024|grep 2ce2 -A 30
  找到最耗CPU的java线程_第3张图片
 

 

Java代码   收藏代码
  1. "DboServiceProcessor-4-thread-295" daemon prio=10 tid=0x00002aab047a9800 nid=0x7d9b waiting on condition [0x0000000046f66000]  

nid : 对应的linux操作系统下的tid,就是前面转化的16进制数字

tid: 这个应该是jvm的jmm内存规范中的唯一地址定位,如果你详细分析jvm的一些内存数据时用得上,我自己还没到那种程度,所以先放下

 

脚本化(dumpmes.sh):

#!/bin/sh

topthread=`top -bn1 -p $1 -H|awk 'NR==8{print $1}'`
echo $topthread
topthread=`printf "%x\n" $topthread`
echo $topthread

/usr/local/jdk1.6.0_31/bin/jstack $1|grep $topthread -A 30

 

 

使用demo:(其中10024为主进程号)

[user@is13084905-0328 data]$dumpmes.sh 10024

 

 

 

 

你可能感兴趣的:(jvm)