通过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: RUNNABLEat java.lang.StringBuilder.append(StringBuilder.java:136)at demo.CpuUsage.main(CpuUsage.java:11)

就能定位到java代码的调用堆栈了


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部