問題排查經常使用方法

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

top+jstack分析cpu太高緣由

https://blog.csdn.net/ct29102656/article/details/51882946io

相關文章
相關標籤/搜索