web-dev-qa-db-ja.com

Windowsで「タスクリスト」を使用してプロセスのCPU使用率を取得する方法

私は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年に誰かが説明を求めましたが、質問に回答した人は返信していません。

ここ は私が見つけた投稿です。

7
JakeSmitch

私はクラスを書いたことがあります:

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の使用状況を出力します。

0
Spektakulatius