前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >window 查找 java 进程中占用cpu比较高的线程

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

作者头像
java404
发布2018-05-18 15:00:44
1.7K0
发布2018-05-18 15:00:44
举报
文章被收录于专栏:java 成神之路java 成神之路

概述

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

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

    1. 使用Process Explorer,第三方工具定位,使用比较简单,容易上手。
    1. 使用window自带的perfmon 性能监控工具进行监控,功能强大,但稍微有点复杂。

示例程序

代码语言:javascript
复制
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 使用

  • 第一步: 获得该程序的进程ID

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

  • 第二步: 打开Process Explorer工具

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

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

打开Process Explorer 后,界面如下:

  • 第三步: 查找进程号为“11964”的进程

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

  • 第四步: 打开该进程Properties界面 然后选中该进程,双击或右键 选择“Properties...”
  • 第五步: 选中“Threads”标签页,查看线程统计信息

选中 Threads 标签页。 发现线程ID为“20024” 的线程占用cpu比较高。

  • 第六步: 线程ID转换成十六进制 然后我们把 十进制的 “20024” 转换为 十六进制的“4E38”。
  • 第七步: dump线程信息 jstack 11964 > thread_dump.txt
  • 第八步: 查找线程ID为“4E38”的线程

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

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

2. Perfmon 使用

  • 第一步: 首先使用 jps 获取当前程序运行的进程ID

进程ID:“8880”

  • 第二步: 打开perfmon 性能监视器
  • 第三步: 打开添加计数器页面
  • 第四步: 添加计数器

在左上部分找中,到Thread,选中 %Processor TimeID Thread 两个选项。 在左下部分中(选定对象的实例),找到所有“javaw”选中,点击添加按钮,然后显示如右半部分效果。

  • 第五步: 切换报告显示方式
  • 第六步: 查找使用CPU比较高的线程

从图中发现线程ID为“10320”的线程,占用CPU比较高。

  • 第七步: 线程ID 转换成十六进制

线程ID 转换成十六进制为“2850”

  • 第八步: dump 线程信息
  • 第九步: 查找线程ID为“2850”的线程

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.01.18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 示例程序
  • 1. Process Explorer 使用
  • 2. Perfmon 使用
相关产品与服务
应用性能监控
应用性能监控(Application Performance Management,APM)是一款应用性能管理平台,基于实时多语言应用探针全量采集技术,为您提供分布式性能分析和故障自检能力。APM 协助您在复杂的业务系统里快速定位性能问题,降低 MTTR(平均故障恢复时间),实时了解并追踪应用性能,提升用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档