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