Top 找到佔cpu最高的那個java進程,java
而後top -Hp 剛纔那個進程號,找到該進程下最耗時的線程號,spa
printf "%x\n" 該線程號 轉成16進制,而後grep這個16進制線程號,找到對應java代碼,而後查看是否有問題.net
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)blog
"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的方式get
具體參考文獻:it
https://blog.csdn.net/ct29102656/article/details/51882946io