CPU占用过高要分情况讨论,是不是业务上在搞活动,突然有大批的流量进来,而且活动结束后cpu占用率就下降了,如果是这种情况其实可以不用太关心,因为请求越多,需要处理的线程数越多,这是正常的现象。

第二种情况,CPU占用率长期过高,这种情况下可能是你的程序存在耗CPU计算的逻辑,也可能循环次数超级多的代码,甚至是出现死循环了。

排查步骤如下:

jps命令获取java进程ID

[root@appserver suninf]# jps -l
3986 sun.tools.jps.Jps
26873 /root/suninf/server/java/target/vps-utils-1.0.0.jar

用top命令查看线程的情况

top –Hp pid

把线程号转换为16进制

[root@appserver ~]# printf "%x" 26903
6917

jstack工具查看线程栈情况

[root@appserver ~]# jstack 26873 | grep 6917 -A 10
"http-nio-8099-exec-1" #19 daemon prio=5 os_prio=0 tid=0x00007fc4545f6000 nid=0x6917 waiting on condition [0x00007fc40abbd000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000e1ad2a70> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
	at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
	at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:103)
	at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:31)
	at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)