Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 窗口任务CPU利用率和Oshi CPU利用率之间的差异_Java_Oshi - Fatal编程技术网

Java 窗口任务CPU利用率和Oshi CPU利用率之间的差异

Java 窗口任务CPU利用率和Oshi CPU利用率之间的差异,java,oshi,Java,Oshi,我使用Oshi API()获取CPU使用率。但是,为什么该值与TaskManager CPU利用率不同?我犯了什么错 我的课程-平均11.13% 任务管理器-平均约29% 编辑代码 问题是,当您打算进行“最近”的使用率计算时,有一行代码将其重置为累积(自启动以来)使用率计算 getSystemCpuLoadBetweenTicks(oldTicks)计算测量从当前计数器到您传递给它的前一个计数器的已用用户、系统、空闲时间等,并提供这些时间片之间的使用率。在cpuData()。那部分是正确的

我使用Oshi API()获取CPU使用率。但是,为什么该值与TaskManager CPU利用率不同?我犯了什么错

我的课程-平均11.13%

任务管理器-平均约29%

编辑代码


问题是,当您打算进行“最近”的使用率计算时,有一行代码将其重置为累积(自启动以来)使用率计算

getSystemCpuLoadBetweenTicks(oldTicks)
计算测量从当前计数器到您传递给它的前一个计数器的已用用户、系统、空闲时间等,并提供这些时间片之间的使用率。在
cpuData()。那部分是正确的

但是,在
processorinformation()
中,每次将
oldTicks
数组归零:
oldTicks=new long[TickType.values().length]。因此,返回的值是自启动以来的累计平均CPU使用率,而不是最近10秒。删除该行(或将其移到计划方法之外)将得到预期的结果

您也不需要每次都使用
cpu
对象的新副本。在移动
oldTicks
初始化时,可以将该初始化移出预定方法

另一方面,@Elliot Frisch在评论中提到了涉及多个处理器的计算。当比较处理器刻度与时间时(例如,如果您正在测量经过的时间段之间的刻度),这是一个有用的警告。滴答声在每个逻辑处理器上累积,因此您需要确保缩放“已用时间”以包括每个逻辑处理器。这在处理每个进程的CPU计算时适用,因为您只有可用的进程启动时间作为分母,在这种情况下,Windows任务管理器会进行缩放,以确保没有进程超过100%,而*nix结果(在
顶部
)不会进行缩放,并且有可能超过100%


但是,对于系统CPU使用率,我们有一个“空闲”的滴答计数器可用,它确实会在所有处理器上累积滴答数,是计算百分比使用率的更好选择——并且是在
getsystemcpuloaddbetweenticks()
方法中使用的,因此不需要进行此更正。

猜一猜?假设您只有(您可能有多个)。我是说。它在现代CPU上很复杂。因为它们通常意味着“一个核心”。但它们也可能意味着每个核心有两个超线程。谦虚的吹嘘:我8岁的台式机有24个CPU。两个物理的。每个6芯。每个内核都有超线程。当然,一个全新的内核应该是128个cpu和一个物理cpu。@ElliottFrisch猜测得不错,但错误的方向正好相反(Windows显示的百分比低于根据原始计算得出的假设值)。答案恰好是累积与瞬时…@DanielWiddis我通常使用Mac或Linux。不完全是。但总的来说,非常感谢。我在使用oshi时仍然有一些问题。1) 我已经编辑了上面的代码:删除oldTicks和cpu对象的零。我说得对吗?2) 如果我将ProcessorInformation()方法的调度程序的固定速率设置为5分钟,会影响结果吗?2) processor.getSystemLoadAverage(3)和processor.getSystemCpuLoadBetweenTicks(oldTicks)之间有什么区别?基于javadoc,平均负载可能在某些平台(如Windows)上不可用,因为在这些平台上,实现这种方法的成本很高。没有窗户吗?听起来不错。2) 如果你把时间定为5分钟,那就是你将得到的平均CPU使用率,过去5分钟的平均值。它很可能与TaskManager不匹配,TaskManager看起来平均每几秒钟一次。3) 负载平均值在*nix中定义为过去1、5和15分钟内系统CPU使用率的指数移动平均值。如果将5分钟平均CPU使用率计算值乘以逻辑处理器的数量,则得到的数字与第二个元素类似(但不精确,因为指数移动平均与简单移动平均不同)。
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]);
}