通过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代码的调用堆栈了

发布了187 篇原创文章 · 获赞 201 · 访问量 47万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览