我正在用Java编写程序来定期显示给定进程ID的CPU和内存使用情况。我的实现调用tasklist。通过以下命令获取内存使用非常简单:
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是我发现的帖子。
任务列表不提供您要查找的信息。我建议使用Get-Counter。 A 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
我曾写过一堂课:
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的使用情况。
记忆就像一个茶杯,它可能是满满的或空的,瞬间看看杯子可以让你看到它是多么的茶(这是你的“memusage”命令)。
CPU就像一个滑雪缆车。无论您是否乘坐电梯,它都会以合理的恒定速度移动。在一次即时观察中无法确定您的使用情况 - 我们需要知道您使用它的时间长度(这是您的“cputime”命令)。你必须至少使用“cputime”命令两次!
例如:
从第一次运行cputime命令到第二次,使用率从28分钟增加到32分钟 - 该进程使用了4分钟的CPU时间。
从晚上7:09到晚上7:17,持续时间为8分钟 - 总共有8分钟的时间,但您的过程只使用了4分钟:4/8 = 50%的平均系统使用率。
如果您的系统有多个处理器,那么您可以除以CPU的总数以获得每个CPU的平均值 - 例如双CPU系统中50%/ 2 = 25%的平均值。
我使用上面的分钟来便于编写 - 实际上,您可能正在查看在一个长达几毫秒的时间窗口中使用的进程的CPU时间的纳秒数。