Java占用CPU过高,一分钟定位线程问题

344 阅读1分钟

在实际开发或者现网中偶尔会遇到Java程序的CPU飙升的,这时怎么快速定位是哪个线程,哪个类的代码出现的问题?在Windows中,我们可以借用微软官方Windows Process Explorer工具查看是哪个线程导致的CPU利用过高,再通过JDK自带的jstack工具导出java程序线程详情,就可以定位到具体代码了。

准备

提前下载Windows Process Explorer与JDK
Windows Process Explorer
JDK(需要使用jstack命令)

示例

准备一段代码,让CPU空转,拉升CPU利用率

public class CpuTest {
    public static void main(String[] args) {
        new Thread(() -> {
            while (true) {
            }
        }).start();
    }
}

使用Windows Process Explorer锁定对应的进程,记录对应PID,比如这里是10048,并双击该进程

PixPin_2025-07-02_11-01-16.png

在弹出的进程详情中,切换到Threads页,并锁定CPU利用率最高的线程,记录线程TID,比如这里的线程是14640

PixPin_2025-07-02_11-02-48.png

使用jstack命令将Java进程的线程信息导出到文件中

PixPin_2025-07-02_11-04-40.png

在导出文件中搜索对应的线程ID,就可以查看出对应的线程名称,以及当时的调用栈,进而快速定位问题根因

image.png