如何在Windows中使用“任务列表”获取进程的CPU使用率

时间:2019-04-17 06:04:13

标签: java windows command-line process cpu-usage

我正在用Java编写程序,以定期显示给定进程ID的CPU和内存使用情况。我的实现调用任务列表。通过以下命令获取内存使用情况非常简单:

tasklist /fi "memusage ge 0" /fi "pid eq 2076" /v

这将返回进程ID 2076的内存使用情况,我可以将其用于我的任务。通过调用以下命令,我可以提取CPU时间。

tasklist /fi "pid eq 2076" /fi "CPUTIME ge 00:00:00" /v

我的问题是,我将如何获得该进程的CPU使用率?

我在StackOverflow上找到了关于我的问题的帖子,但是答案不清楚,而且我不明白在命令中键入什么来获得所需的信息。问题在2008年得到了回答,有人在2013年要求澄清,但回答问题的人没有回答。

Here是我发现的帖子。

3 个答案:

答案 0 :(得分:1)

任务列表不提供您要查找的信息。我建议使用Get-CounterA comment on an answer from the SuperUser site似乎在追寻您的目标。

Get-Counter '\Process(*)\% Processor Time' | Select-Object -ExpandProperty countersamples| Select-Object -Property instancename, cookedvalue| ? {$_.instanceName -notmatch "^(idle|_total|system)$"} | Sort-Object -Property cookedvalue -Descending| Select-Object -First 25| ft InstanceName,@{L='CPU';E={($_.Cookedvalue/100/$env:NUMBER_OF_PROCESSORS).toString('P')}} -AutoSize

答案 1 :(得分:1)

我曾经写过一堂课:

private static class PerformanceMonitor {
    private int availableProcessors = ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors();
    private long lastSystemTime = 0;
    private long lastProcessCpuTime = 0;

    /**
     * Get's the cpu usage of the jvm
     *
     * @return the cpu usage a double of percentage
     */
    private synchronized double getCpuUsage() {
        if (lastSystemTime == 0) {
            baselineCounters();
            return 0d;
        }

        long systemTime = System.nanoTime();
        long processCpuTime = 0;

        if (getOperatingSystemMXBean() instanceof com.sun.management.OperatingSystemMXBean) {
            processCpuTime = ((com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean()).getProcessCpuTime();
        }

        double cpuUsage = ((double) (processCpuTime - lastProcessCpuTime)) / ((double) (systemTime - lastSystemTime));

        lastSystemTime = systemTime;
        lastProcessCpuTime = processCpuTime;

        return cpuUsage / availableProcessors;
    }

    private void baselineCounters() {
        lastSystemTime = System.nanoTime();

        if (getOperatingSystemMXBean() instanceof com.sun.management.OperatingSystemMXBean) {
            lastProcessCpuTime = ((com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean()).getProcessCpuTime();
        }
    }
}

其用法类似于:

 private static final PerformanceMonitor _MONITOR = new PerformanceMonitor();
 _MONITOR.getCpuUsage();

这将打印出此JVM进程消耗的cpu的用法。

答案 2 :(得分:1)

记忆就像一个茶杯,它可能已满也可能是空的,瞬间查看杯子,您可以看到茶已充满了(这是您的“ memusage”命令)。

CPU就像滑雪缆车一样。无论您是否乘坐电梯,它都会以合理的恒定速度移动。不可能通过一个瞬时观测值来确定您的使用情况-我们需要知道您骑了多长时间(这就是您的“ cputime”命令)。您必须至少使用“ cputime”命令两次!

例如:

  • 在7:09 pm,您在进程上运行cputime命令,它返回“ 28分钟”
  • 在7:17 pm,您在进程上再次运行cputime命令,它返回“ 32分钟”

从第一次运行cputime命令到第二次,使用时间从28分钟增加到了32分钟-该进程使用了​​4分钟的CPU时间。

从7:09 pm到7:17 pm的持续时间为8分钟-总共有8分钟的时间可用,但是您的过程仅使用了4分钟:4/8 = 50%的平均系统使用率。

如果您的系统具有多个处理器,则可以将其除以CPU总数以获得每个CPU的平均值-例如双CPU系统中的平均值为50%/ 2 = 25%。

为了便于编写,我在上面花了几分钟的时间-实际上,您可能正在查看该过程在仅几毫秒长的时间窗口内使用了多少纳秒的CPU时间。