分析java应用占用cpu高的线程

一、使用top+jstack定位java应用CPU占用高的线程步骤

  1. ps axu | grep java 或者直接jps得到进程号
  2. top  -p   java进程号
  3. 在top界面按小写的s改变默认刷新值到0.5s
  4. 在shift +h 键,按线程进行显示
  5. 到现在为止,基本可以看到是哪个线程占用CPU较高了
  6. 假如线程号为21646,转换为16进制  548e
  7. jstack  java进程号 | grep -A  20  java线程号16进制

二、使用top+jstack定位java应用CPU占用高的线程详细说明

1.top查找出哪个进程消耗的cpu高


PID

USER

PR

NI

VIRT

RES

SHR

S

%CPU

%MEM

TIME+

COMMAND

21125

co_ad2

18

0

1817m

776m

9712

S

3.3

4.9

12:03.24

java

5284

co_ad

21

0

3028m

2.5g

9432

S

1.0

16.3

6629:44

java

21994

mysql

15

0

449m

88m

5072

S

1.0

0.6

67582:38

mysqld

8657

co_sparr

19

0

2678m

892m

9220

S

0.3

5.7

103:06.13

java

 这里我们分析21125这个java进程。

2.top中shift+h查找出哪个线程消耗的cpu高

PID

USER

PR

NI

VIRT

RES

SHR

S

%CPU

%MEM

TIME+

COMMAND

21233

co_ad2

15

0

1807m

630m

9492

S

1.3

4.0

0:05.12

java

20503

co_ad2_s

15

0

1360m

560m

9176

S

0.3

3.6

0:46.72

java

21134

co_ad2

15

0

1807m

630m

9492

S

0.3

4.0

0:00.72

java

22673

co_ad2

15

0

1807m

630m

9492

S

0.3

4.0

0:03.12

java

 

这里我们分析21233这个线程,并且注意的是,这个线程是属于21125这个进程的。

3.jstack查找这个线程的信息
jstack [进程]|grep -A 10 [线程的16进制]
即: jstack  21125 |grep -A  10  52f1 

 

-A 10表示查找到所在行的后10行。21233转换为16进制52f1,注意字母是小写。
结果:

写道
"http-8081-11" daemon prio= 10 tid= 0x00002aab049a1800 nid= 0x52f1 in Object.wait() [ 0x0000000042c75000 ]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485 )
at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416 )

 说不定可以一下子定位到出问题的代码。

 

三、找出占用cpu高的java线程脚本

写道
#!/bin/bash

typeset top=${1:-10}
typeset pid=${2:-$(pgrep -u $USER java)}
typeset tmp_file=/tmp/java_$pid_$$.trace

$JAVA_HOME/bin/jstack $pid > $tmp_file
ps H -eo user,pid,ppid,tid,time,%cpu --sort=%cpu|tail -$top|awk '$2==pid{print $4"\t"$6}' pid=$pid|while read line;
do
typeset nid="0x"$(echo "$line"|awk '{print $1}'|xargs -I{} echo "obase=16;{}"|bc|tr 'A-Z' 'a-z')
typeset cpu=$(echo "$line"|awk '{print $2}')
cat $tmp_file|awk '/nid='"$nid"'/,/^$/{print $0"\t"(isF++?"":"cpu="'"$cpu"'"%");}'
done;

rm -f $tmp_file

 四、jtop

https://code.google.com/p/hatter-source-code/wiki/jtop

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值