0 测试代码
import java.util.Random;
public class Main {
public static void main(String[] args) {
while (true) {
System.out.println(new Random().nextInt(Integer.MAX_VALUE));
}
}
}
先执行 nohup java Main 2>&1 & 将上面这段代码在 Linux 后台跑起来,以下截图均基于此代码进行
1 用 top 命令找出 CPU 占比最高的进程 ID

发现 CPU 占比最高的进程 ID 为 6609
2 ps aux 或 jps -l 进一步定位,是怎样的程序

可以看到 6609 这个进程就是在第 0 步执行的测试类
3 使用 ps -mp 定位到具体线程或代码

可以看到 6610 这个线程 ID 对应的线程 CPU 使用占比最高,并且占用 CPU 时间也最长
4 将十进制线程 ID 转换为十六进制
可以使用计算器也可以执行 printf "%x\n" num,这里使用命令行操作

5 执行 jstack PID | grep TID(十六进制小写) -A60(前60行)

发现问题出在 Main.java 的第 6 行,往上看一下测试代码,第 6 行正是 System.out.println(new Random().nextInt(Integer.MAX_VALUE));
至此,问题代码已精准定位