java 虚拟机java 成神之路程序员

window 查找 java 进程中占用cpu比较高的线程

2018-01-18  本文已影响193人  jijs

概述

公司内部的一个产品 (java 开发的) 运行在 window 虚拟机上,运行一段时间后CPU飙升,然后想查看是哪个线程占用。
折腾了一下午,终于定位到该线程。

下面我们通过两种方式定位到占用cpu比较高的线程。

示例程序

public class ThreadCpuTest {
    public static void main(String[] args) {
        Thread busyTask = new Thread(() -> {
            for (;;) {
                double a = new Random().nextDouble();
                double b = new Random().nextDouble();

                double c = a * b;
            }
        });
        busyTask.setName("busy task");
        busyTask.start();

        Thread lazyTask = new Thread(() -> {
            for (;;) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        busyTask.setName("lazy task");
        lazyTask.start();
    }
}

运行该示例,然后使用监控工具定位到那个线程CPU使用率高。

1. Process Explorer 使用


通过 jps 可以查看到 我们运行的程序的进程号为 “11964”

下面我们通过 Process Explorer 工具进行查看 该进程中所有的线程。

如果你没有 Process Explorer ,点击下面连接,进行下载。
点击 https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer 地址下载 Process Explorer

打开Process Explorer 后,界面如下:


通过 jps 命令查看的进程号为 “11964”。然后在 Process Explorer中找到该进程。

从线程的名字中,我们发现该线程的名字是“busy_task”。

然后就可以找到该线程,查看该线程是什么原因大量占用CPU,剩下的就是改程序的事情了

2. Perfmon 使用

从线程堆栈信息中可以看出该线程为“busy_task”线程。

想了解更多精彩内容请关注我的公众号

上一篇下一篇

猜你喜欢

热点阅读