我使用Oshi (https://github.com/oshi/oshi)来获得CPU的使用率。但是,为什么这个值不同于任务管理器CPU利用率呢?我犯了什么错?
我的计划--平均11.13%

任务管理器-平均约29%

编辑代码
private SystemInfo systemInformation = new SystemInfo();
private CentralProcessor proc = systemInformation.getHardware().getProcessor();
private static float[] floatArrayPercent(double d) {
float[] f = new float[1];
f[0] = (float) (100d * d);
return f;
}
private double cpuData(CentralProcessor proc) {
double d = proc.getSystemCpuLoadBetweenTicks(oldTicks);
oldTicks = proc.getSystemCpuLoadTicks();
return d;
}
@Scheduled(fixedRate = 10)
public void processProcessorInformation() {
System.out.println("The percentage of the floating value cpu: " + floatArrayPercent(cpuData(proc))[0]);
}发布于 2020-04-09 22:46:49
问题是,当您打算进行“最近”使用情况计算时,有一行代码会将其重置为累积(自启动以来)的使用量计算。
getSystemCpuLoadBetweenTicks(oldTicks)计算测量用户、系统、空闲等从当前计数器到之前传递给它的计数器的运行情况,并在这些时间点之间给出使用情况。在您的cpuData()方法中,您正确地保存了旧代码,并可能打算再次使用它们。那部分是对的。
但是,在您的processProcessorInformation()中,您每次都会将oldTicks数组调零:oldTicks = new long[TickType.values().length];。因此,返回的值是启动后的累积平均CPU使用量,而不是最后10秒。删除该行(或将其移出预定的方法)应该会给出您期望的结果。
您也不需要每次都需要cpu对象的新副本。在移动oldTicks初始化时,可以将该初始化从计划的方法中移出。
在一个相关的注释中,@Elliot提到了涉及多个处理器的计算。这是一个有用的警告时,比较处理器滴答与时间(例如,如果你测量之间经过的时间周期滴答)。滴答在每个逻辑处理器上累积,因此您需要确保缩放“经过的时间”,以包括每个逻辑处理器。这适用于处理每个进程的CPU计算,因为您只有进程启动时间作为分母,在这种情况下,Windows被缩放以确保进程不超过100%,而*nix结果(在top上)没有缩放,并且有可能超过100%。
然而,对于系统CPU的使用,我们有一个可用的“空闲”滴答计数器,它确实会在所有处理器上累积滴答,是计算百分比使用率的更好的选择--也是getSystemCpuLoadBetweenTicks()方法中使用的方法,因此不需要进行这种校正。
https://stackoverflow.com/questions/61115251
复制相似问题