最近被问了个问题说,linux下如果查找出cpu资源占用最高的java线程,当时就懵了,还真不知道怎么去找,不过确确实实会有这样的需求,为嘛不学习学习下呢。

网上有几种方案可以找出比较占用资源的线程,其中比较常用的是top+jstack

top命令可以参考笔记top

先通过jps查询出java的进程号23395

然后

top -Hp 23395 -d 1 -n 1  
1

查出cpu占用最高的线程

Threads:  60 total,   0 running,  60 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.6 us,  0.2 sy,  0.0 ni, 99.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   949448 total,    68028 free,   481844 used,   399576 buff/cache
KiB Swap:  4194300 total,  4190972 free,     3328 used.   342492 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                              
23428 pi        20   0  263228 166136   9216 S 17.6 17.5   5:49.78 java                                                 
23395 pi        20   0  263228 166136   9216 S  0.0 17.5   0:00.01 java                      
23396 pi        20   0  263228 166136   9216 S  0.0 17.5   0:48.57 java                      
23397 pi        20   0  263228 166136   9216 S  0.0 17.5   4:22.95 java                      
23398 pi        20   0  263228 166136   9216 S  0.0 17.5   0:03.28 java                      
23399 pi        20   0  263228 166136   9216 S  0.0 17.5   0:05.53 java                      
23400 pi        20   0  263228 166136   9216 S  0.0 17.5   0:00.00 java    å                  
23401 pi        20   0  263228 166136   9216 S  0.0 17.5  25:07.97 java                      
23402 pi        20   0  263228 166136   9216 S  0.0 17.5   0:16.36 java                      
23403 pi        20   0  263228 166136   9216 S  0.0 17.5   5:11.42 java                      
23413 pi        20   0  263228 166136   9216 S  0.0 17.5   0:00.00 java                      
23414 pi        20   0  263228 166136   9216 S  0.0 17.5   3:00.36 java                      
23415 pi        20   0  263228 166136   9216 S  0.0 17.5   0:00.00 java                      
23416 pi        20   0  263228 166136   9216 S  0.0 17.5   3:01.53 java  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

其中进程23395占用的cpu比较高,转换成16进制为5b84,可以用在**线进制转换**工具在线转换,

执行

jstack -l 23395 | grep 5b84
1

查询出线程号指定的java线程

"http-nio-8120-exec-4" #27 daemon prio=5 os_prio=0 tid=0x6a1eb400 nid=0x5b84 waiting on condition [0x68ede000]
1