通過jstack分析java進程耗費CPU的原因

1、通過jps -l來找到需要跟蹤的java進程的pid,下面使用$PID來標識

# jps -l
27544 org.logstash.Logstash
16620 demo.CpuUsage
16639 sun.tools.jps.Jps

2、通過top -p $PID -H來跟蹤該進程的

top -p 16620 -H

可以發現16621的CPU利用率達到了65.2%

top - 17:40:40 up 191 days,  5:31,  2 users,  load average: 0.71, 0.27, 0.35
Threads:  10 total,   1 running,   9 sleeping,   0 stopped,   0 zombie
%Cpu(s): 73.3 us, 26.7 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1884124 total,   585416 free,  1096348 used,   202360 buff/cache
KiB Swap:  2097148 total,  1700880 free,   396268 used.   633348 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                            
16621 root      20   0 2460136  30300  11960 R 65.2  1.6   0:29.92 java                                                                                               
16622 root      20   0 2460136  30300  11960 S  2.2  1.6   0:00.03 java                                                                                               
16629 root      20   0 2460136  30300  11960 S  2.2  1.6   0:00.01 java                                                                                               
16620 root      20   0 2460136  30300  11960 S  0.0  1.6   0:00.00 java                                                                                               
16623 root      20   0 2460136  30300  11960 S  0.0  1.6   0:00.00 java                                                                                               
16624 root      20   0 2460136  30300  11960 S  0.0  1.6   0:00.00 java                                                                                               
16625 root      20   0 2460136  30300  11960 S  0.0  1.6   0:00.00 java                                                                                               
16626 root      20   0 2460136  30300  11960 S  0.0  1.6   0:00.14 java                                                                                               
16627 root      20   0 2460136  30300  11960 S  0.0  1.6   0:00.01 java                                                                                               
16628 root      20   0 2460136  30300  11960 S  0.0  1.6   0:00.00 java

3、查看hex值

訪問 16進制轉換工具,將16621轉換爲16進制,轉換以後是40ed

4、生成jstack

# jstack $PID > jstack.txt

然後再jstack中查找16進制的id 40ed

"main" #1 prio=5 os_prio=0 tid=0x00007efd18009000 nid=0x40ed runnable [0x00007efd1e1a7000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.StringBuilder.append(StringBuilder.java:136)
        at demo.CpuUsage.main(CpuUsage.java:11)

就能定位到java代碼的調用堆棧了

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