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)