java進程消耗cpu高分析

1、使用top命令找到消耗cpu高的進程

[zhaikaiyun@testhost ~]$ top
Tasks: 304 total,   1 running, 303 sleeping,   0 stopped,   0 zombie
%Cpu(s): 20.3 us, 25.0 sy,  0.0 ni, 52.4 id,  0.0 wa,  0.0 hi,  1.0 si,  1.2 st
KiB Mem : 32779460 total,  5207912 free, 22593888 used,  4977660 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  9642932 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                     
18401 zhaikaiyun      20   0 13.095g 4.118g  30300 S 194.4 13.2  87:58.19 java                                                                                        
19247 zhaikaiyun      20   0 13.048g 3.811g  30264 S 152.8 12.2  86:13.30 java                                                                                        
19056 zhaikaiyun      20   0 13.098g 3.963g  30292 S 135.9 12.7  86:41.30 java                                                                                        
18731 zhaikaiyun      20   0 13.092g 4.191g  30276 S 135.5 13.4  87:55.69 java                                                                                        
19328 zhaikaiyun      20   0 13.169g 4.246g  30288 S 128.6 13.6  86:40.14 java


2、根據進程pid查找消耗cpu的線程

[zhaikaiyun@testhost ~]$ ps -mp 19056 -o THREAD,tid,time | sort -rn| head -10
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
zhaikaiyun     89.1  19    - ?         -      - 20194 00:21:51
zhaikaiyun      4.2  19    - futex_    -      - 19437 00:01:02
zhaikaiyun      3.9  19    - futex_    -      - 19438 00:00:58
zhaikaiyun      3.3  19    - futex_    -      - 19063 00:00:50
zhaikaiyun      2.0  19    - ep_pol    -      - 24441 00:00:28
zhaikaiyun      197   -    - -         -      -     - 00:49:16
zhaikaiyun      1.8  19    - futex_    -      - 24651 00:00:24
zhaikaiyun      1.7  19    - futex_    -      - 19065 00:00:25
zhaikaiyun      1.6  19    - futex_    -      - 24976 00:00:22
[zhaikaiyun@testhost ~]$ ps -mp 19056 -o THREAD,tid,time | sort -rn| head -10
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
zhaikaiyun     89.1  19    - ?         -      - 20194 00:21:58
zhaikaiyun      4.1  19    - futex_    -      - 19437 00:01:02
zhaikaiyun      3.9  19    - futex_    -      - 19438 00:00:58
zhaikaiyun      3.3  19    - futex_    -      - 19063 00:00:50
zhaikaiyun      2.0  19    - ep_pol    -      - 24441 00:00:28
zhaikaiyun      197   -    - -         -      -     - 00:49:29
zhaikaiyun      1.8  19    - futex_    -      - 24651 00:00:25
zhaikaiyun      1.7  19    - futex_    -      - 19065 00:00:25
zhaikaiyun      1.6  19    - futex_    -      - 24976 00:00:22
[zhaikaiyun@testhost ~]$ ps -mp 19056 -o THREAD,tid,time | sort -rn| head -10
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
zhaikaiyun     89.2  19    - ?         -      - 20194 00:21:59
zhaikaiyun      4.1  19    - futex_    -      - 19437 00:01:02
zhaikaiyun      3.9  19    - futex_    -      - 19438 00:00:58
zhaikaiyun      3.3  19    - futex_    -      - 19063 00:00:50
zhaikaiyun      2.0  19    - ep_pol    -      - 24441 00:00:28
zhaikaiyun      197   -    - -         -      -     - 00:49:31
zhaikaiyun      1.8  19    - futex_    -      - 24651 00:00:25
zhaikaiyun      1.7  19    - futex_    -      - 19065 00:00:25
zhaikaiyun      1.6  19    - futex_    -      - 24976 00:00:22

3、線程ID轉換爲16進制格式

[zhaikaiyun@testhost ~]$ printf "%x\n" 20194
4ee2

4、通過jstack查看線程快照,找到具體線程堆棧進行分析

[zhaikaiyun@testhost ~]$ jstack -l 62  |grep 0x4ee2 -A 30
"consumer-0" daemon prio=10 tid=0x00007f379ce52800 nid=0x4ee2 runnable [0x00007f37734f2000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.Thread.yield(Native Method)
        at com.lmax.disruptor.YieldingWaitStrategy.applyWaitMethod(YieldingWaitStrategy.java:57)
        at com.lmax.disruptor.YieldingWaitStrategy.waitFor(YieldingWaitStrategy.java:39)
        at com.lmax.disruptor.ProcessingSequenceBarrier.waitFor(ProcessingSequenceBarrier.java:56)
        at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:128)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
        - <0x000000071b207cb8> (a java.util.concurrent.ThreadPoolExecutor$Worker)
        
        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章