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代碼的調用堆棧了