一、使用top+jstack定位java应用CPU占用高的线程步骤
- ps axu | grep java 或者直接jps得到进程号
- top -p java进程号
- 在top界面按小写的s改变默认刷新值到0.5s
- 在shift +h 键,按线程进行显示
- 到现在为止,基本可以看到是哪个线程占用CPU较高了
- 假如线程号为21646,转换为16进制 548e
- 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,注意字母是小写。
结果:
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线程脚本
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