监测Java线程CPU占用情况

当我们在linux服务器上用top命令发现Java进程CPU占用很高时, 我们可以使用以下命令查看Java程序中每条Thread CPU的使用情况:

# ps -C java -L -o pcpu,cpu,nice,state,cputime,pid,tid | sort
OR

# ps -C  -L -o pcpu,cpu,nice,state,cputime,pid,tid | sort

为了定时去查看每条Thread CPU的使用,如每秒输出一次,使用以下Shell Script

[root@ip tmp]#vi cpu.sh

!/bin/sh
while [ true ]; do
/bin/sleep 1
ps -C java -L -o pcpu,cpu,nice,state,cputime,pid,tid | sort
done

执行cpu.sh

[root@ip tmp]#chmod 755 ./cpu.sh
[root@ip tmp]#./cpu.sh

每秒输出如下

 0.1   -   0 S 00:25:42 28009 28315
 0.1   -   0 S 00:25:42 28009 28363
 0.1   -   0 S 00:25:42 28009 28368
 0.1   -   0 S 00:25:42 28009 28502
 0.1   -   0 S 00:25:42 28009 28503
 0.1   -   0 S 00:25:43 28009 28327
 0.1   -   0 S 00:25:43 28009 28494
 0.1   -   0 S 00:25:43 28009 28582
 0.1   -   0 S 00:25:43 28009 28836
 0.1   -   0 S 00:25:44 28009 28499
 0.1   -   0 S 00:25:44 28009 28693
 0.1   -   0 S 00:25:45 28009 28379
 0.1   -   0 S 00:29:26 28009 28119
 0.1   -   0 S 00:37:17 28009 28124
 0.2   -   0 S 00:44:35 28009 28014
 1.0   -   0 S 03:48:57 28009 28288
 1.0   -   0 S 03:50:00 28009 28287
 1.0   -   0 S 03:50:55 28009 28284
 1.0   -   0 S 03:51:07 28009 28286
 1.0   -   0 S 03:51:14 28009 28285
 1.1   -   0 S 04:05:46 28009 28011
 1.1   -   0 S 04:05:57 28009 28012
 1.2   -   0 S 04:31:31 28009 28122
%CPU CPU  NI S     TIME   PID   TID

执行jstack命令查看thread 信息:

[root@ip-172-31-43-56 bin]# /opt/jdk1.8.0_60/bin/jstack -F 28009 >>/tmp/threads.log

cpu.sh命令输出的TID, 如28122,就可以在/tmp/threads.log中查看

Thread 28122: (state = BLOCKED)
 - java.lang.Thread.sleep(long) @bci=0 (Compiled frame; information may be imprecise)
 - com.altai.ac.care.lts.LtsService$LtsThread.run() @bci=455, line=341 (Compiled frame)

从上面可以看出是LtsThread占用了1.2%的CPU

你可能感兴趣的:(JAVA)