分析占用了大量 CPU 处理时间的是Java 进程中哪个线程


在Linux上运行下面程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class Test {

public static void main(String[] args) throws InterruptedException {
AtomicInteger atomicLong = new AtomicInteger();

Thread adder = new Thread(() -> {
while (true) atomicLong.addAndGet(1);
});

Thread printer = new Thread(() -> {
while (true) {
System.out.println(LocalDateTime.now() + " : " + atomicLong.get());
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});

adder.start();
printer.start();
adder.join();
printer.join();
}
}

然后执行下面的命令

整个查找过程很简单,就是通过top -H -p tid 这个命令找到最繁忙的线程id, 然后用jstack 命令导出该进程所有的线程信息,然后用top找到的线程id从jstack导出的文件里进行过滤查找。