Java程序CPU占用过高问题定位

295 阅读1分钟

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));

至此,问题代码已精准定位