Top 找到占cpu最高的那个java进程,
然后top -Hp 刚才那个进程号,找到该进程下最耗时的线程号,
printf "%x\n" 该线程号 转成16进制,然后grep这个16进制线程号,找到对应java代码,然后查看是否有问题
jstack 30162|grep -A 20 76c8
"sentinel-time-tick-thread" daemon prio=10 tid=0x00007f9e5800a000 nid=0x76c8 sleeping[0x00007f9e8082c000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:360)
at com.alibaba.csp.sentinel.util.TimeUtil$1.run(TimeUtil.java:37)
at java.lang.Thread.run(Thread.java:745)
"DubboServerHandler-100.73.44.63:20880-thread-64" daemon prio=10 tid=0x00007f9e608da000 nid=0x76c7 waiting on condition [0x00007f9e8092d000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x0000000700335a80> (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:458)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:359)
at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:925)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
生产上不方便的话可以用btrace的方式
具体参考文献:
top+jstack分析cpu过高原因
https://blog.csdn.net/ct29102656/article/details/51882946