Linux中查找最耗CPU的Java代码问题

 第一步: 查看消耗CPU最高的进程PID

[lolaage@web2 tomcat-ns]$ top

top - 13:23:32 up 42 days, 19:11,  3 users,  load average: 1.01, 0.86, 0.78

Tasks: 153 total,   2 running, 151 sleeping,   0 stopped,   0 zombie

%Cpu(s): 16.3 us,  0.8 sy,  0.0 ni, 82.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

KiB Mem : 16267172 total,  1135628 free,  6554372 used,  8577172 buff/cache

KiB Swap:        0 total,        0 free,        0 used.  9275688 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                        

23496 lolaage   20   0 9985736 1.978g  11148 S 104.8 12.7  32:17.81 java                                                                                                                                                           

 5081 lolaage   20   0 1289012 328804   2012 S   9.7  2.0   2562:11 srs                                                                                                                                                            

 1958 lolaage   20   0 10.631g 2.809g   7520 S   8.9 18.1   2332:34 java                                                                                                                                                          

    1 root      20   0   43800   3700   1932 S   0.0  0.0   6:29.39 systemd                                                                                                                                                       

    2 root      20   0       0      0      0 S   0.0  0.0   0:01.03 kthreadd                                                                                                                                                      

    3 root      20   0       0      0      0 S   0.0  0.0   2:12.16 ksoftirqd/0                                                                                                                                                    

                                                                                                                                      

第二步:查看消耗CPU最高的线程TID                                                                                                                                     

[lolaage@video1 mpmt-socket]$  ps -mp 23496 -o THREAD,tid,time

USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME

lolaage  51.6   -    - -         -      -     - 00:32:22

lolaage   0.0  19    - futex_    -      - 23496 00:00:00

lolaage   0.3  19    - futex_    -      - 23508 00:00:14

lolaage   0.0  19    - ep_pol    -      - 23530 00:00:00

lolaage   0.0  19    - futex_    -      - 23539 00:00:00

lolaage   4.5  19    - futex_    -      - 23541 00:02:51

lolaage   4.5  19    - futex_    -      - 23543 00:02:51

lolaage   4.5  19    - futex_    -      - 23545 00:02:52

lolaage   4.5  19    - futex_    -      - 23546 00:02:51

lolaage   4.5  19    - futex_    -      - 23547 00:02:51

lolaage   4.6  19    - -         -      - 23548 00:02:55

lolaage   5.3  19    - futex_    -      - 23549 00:03:19

lolaage   5.3  19    - futex_    -      - 23550 00:03:20

lolaage   4.5  19    - futex_    -      - 23551 00:02:50

lolaage   4.5  19    - futex_    -      - 23552 00:02:51

lolaage   0.0  19    - futex_    -      - 23553 00:00:00

第三步:把线程ID转为16进制

[lolaage@video1 mpmt-socket]$ printf "%x " 23549

5bfd

第四步:查看堆栈信息

[lolaage@video1 mpmt-socket]$ jstack 23496 |grep 5bfd -A 30

"startQuertz_Worker-7" #25 prio=5 os_prio=0 tid=0x00007fb5fcdf8800 nid=0x5bfd in Object.wait() [0x00007fb5f6629000]

   java.lang.Thread.State: TIMED_WAITING (on object monitor)

         at java.lang.Object.wait(Native Method)

         at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)

         - locked <0x00000006c8d35208> (a java.lang.Object)

"startQuertz_Worker-6" #24 prio=5 os_prio=0 tid=0x00007fb5fcdf6800 nid=0x5bfc in Object.wait() [0x00007fb5f672a000]

   java.lang.Thread.State: TIMED_WAITING (on object monitor)

         at java.lang.Object.wait(Native Method)

         at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)

         - locked <0x00000006c8d15290> (a java.lang.Object)

"startQuertz_Worker-5" #23 prio=5 os_prio=0 tid=0x00007fb5fcdf4800 nid=0x5bfb in Object.wait() [0x00007fb5f682b000]

   java.lang.Thread.State: TIMED_WAITING (on object monitor)

         at java.lang.Object.wait(Native Method)

         at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)

         - locked <0x00000006c8d14fa8> (a java.lang.Object)

"startQuertz_Worker-4" #22 prio=5 os_prio=0 tid=0x00007fb5fcdf2800 nid=0x5bfa in Object.wait() [0x00007fb5f692c000]

   java.lang.Thread.State: TIMED_WAITING (on object monitor)

         at java.lang.Object.wait(Native Method)

         at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:568)

         - locked <0x00000006c8d14cc0> (a java.lang.Object)

经检查发现相关的程序代码中使用了locked导致的

原文地址:https://www.cnblogs.com/brant/p/11434864.html