在实际开发或者现网中偶尔会遇到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,并双击该进程
在弹出的进程详情中,切换到Threads页,并锁定CPU利用率最高的线程,记录线程TID,比如这里的线程是14640
使用jstack命令将Java进程的线程信息导出到文件中
在导出文件中搜索对应的线程ID,就可以查看出对应的线程名称,以及当时的调用栈,进而快速定位问题根因