我正在尝试使用Java 11获取CPU利用率或使用情况。
我的期望是总使用率的平均百分比,我对CPU上可用的核心数或线程数并不感兴趣。
简单来说,在80%时,CPU非常忙碌,在10%左右则基本上处于闲置状态。
我该如何获得这个信息?
我已经尝试了一些stackoverflow上的建议。
选项1:使用com.sun.management.OperatingSystemMXBean
不好,任何com.sun
都已经过时,应该避免使用。
选项2:有一个第三方库org.hyperic.sigar.CpuInfo
,但该项目似乎已经过时且不再维护。下面的cpuInfo.getVendor(),cpuInfo.getModel()
的结果是null null
。这给了我信心(讽刺)。
protected void getCPUUtilization4() {
CpuInfo cpuInfo = new CpuInfo();
System.out.println(String.format(" CpuInfo: %s %s", cpuInfo.getVendor(), cpuInfo.getModel()));
}
选项3:内置在Java的java.lang.management.OperatingSystemMXBean
中。这个选项的问题是osBean.getSystemLoadAverage()
返回的是一个double
值。当我的CPU处于空闲状态时,它约为1.3
,当我的CPU繁忙时,它可以达到约2.9
。osBean.getAvailableProcessors()
返回8
。我相当确定这是一颗Intel四核心处理器,具有总共8个线程。但这些数字意味着什么呢?
protected double getCPUUtilization5() {
OperatingSystemMXBean osBean =
ManagementFactory.getOperatingSystemMXBean();
if (startSystemAverage == null) {
startSystemAverage = osBean.getSystemLoadAverage();
peakSystemAverage = osBean.getSystemLoadAverage();
}
if (peakSystemAverage < osBean.getSystemLoadAverage()) {
peakSystemAverage = osBean.getSystemLoadAverage();
}
double sysAvg = osBean.getSystemLoadAverage();
logger.info(" getCPUUtilization5: "+ sysAvg + " num of processors: "+ osBean.getAvailableProcessors());
return sysAvg;
}