前几天发现测试环境的CPU一直很高,因而就去排查了一下缘由,以前在程序管理里面介绍过,能够经过top命令查看linux系统进程的资源占用。因而运行top命令以下:java
从上图中能够看到其中有一个线程的CPU很是高,PID是31461.虽然咱们知道了是一个java进程,也知道了PID号码,可是咱们并不知道究竟是那部分代码占用的CPU较高,这个时候咱们就可使用 top -Hp Pid的命令,来查看具体占用CPU资源的进程:linux
而后从线程的列表中找到CPU占用最高的线程ID。好比说4244. 咱们知道占用CPU高的进程是JAVA进程,那么咱们就可使用jstack命令来查看java进程的栈信息,可是有个问题是jstack打出来的内容太多了,我怎么肯定具体是哪一个栈的占用CPU高呢? 这时就须要用到前面咱们找到的线程ID了。因为jstack中使用的16进制,所以咱们须要把线程ID:4244 转为16进制为1094.而后咱们可使用下面的命令查看这个线程对应栈信息:
jstack PID | grep -A 10 16进制线程ID:jstack 31461 | grep -A 10 1094:测试
[root@iZ23ozpjtzfZ ~]# jstack 31461 | grep -A 10 1094 "cat-TcpSocketSender" #243 daemon prio=5 os_prio=0 tid=0x00007f779c3be000 nid=0x1094 runnable [0x00007f7767a31000] java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000000f8b7f928> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467) at com.dianping.cat.message.io.DefaultMessageQueue.poll(DefaultMessageQueue.java:49) at com.dianping.cat.message.io.TcpSocketSender.run(TcpSocketSender.java:176) at java.lang.Thread.run(Thread.java:748) at org.unidal.helper.Threads$RunnableThread.run(Threads.java:294
这样就定位了问题所在,以后就能够查看具体是什么缘由致使这段代码占用CPU太高。spa