话不多说,先上代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class CpuMax {
public static void main(String[] args) {
for(int i =0 ; i < 10 ; i ++){
new Thread(() -> {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}

Thread t = new Thread(() -> {
int i = 0;
while (true){
i = (i++) /100;
}
});

t.setName("Business Thread");
t.start();

}
}

有11个线程,其中10个线程啥也不做,1个线程执行死循环操作。那么如何定位消耗CPU最多的这个线程呢?且看以下解决思路:

1. 运行程序

1
2
3
4
5
# 编译
javac CpuMax.java

# 运行
java CpuMax

2. 获取进程PID

1
ps -ef | grep "CpuMax"

得到进程PID: 5055

3. 获取进程中各线程所占CPU的占比

1
top -Hp 5505

根据图片信息,我们可以得到:CPU占比99.9%的线程PID为5084。线程PID转为16进制为:ox13dc

4. 打印进程中各个线程栈信息

1
jstack 5055

得到以下信息:

步骤3中,我们得到CPU最大的线程的PID,16进制为:0x13dc,在线程栈中,我们可以根据16进制的PID得到一些关键信息。得到线程名为「Business Thread」为CPU占比最高的线程