2

我想获得 cpu 使用率来连续使用 java 更新我的数据库。在第一个循环中,此代码可以读取正确的 cpu 使用情况。之后,它返回小于 0 的错误值。所以,我卡住了。

我使用了 jdk 1.8.124。

请让我知道如何连续获取 cpu 使用率。

import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.HardwareAbstractionLayer;

源代码

public static void main(String[] args) {
  OperatingSystemMXBean bean = (com.sun.management.OperatingSystemMXBean) ManagementFactory
      .getOperatingSystemMXBean();

  while (true) {
    System.out.println(bean.getProcessCpuLoad());
    System.out.println(bean.getSystemCpuLoad());
        try {
            Thread.sleep(3000);
        }
        catch (Exception e){
            System.out.println(e.toString());
            break;
        }
  }

}
4

2 回答 2

2

这是通过使用 Oshi lib 完成的。

我可以每 20 秒获取一次 cpu 使用率

import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.HardwareAbstractionLayer;

源代码

private SystemInfo si = new SystemInfo();
private HardwareAbstractionLayer hal = si.getHardware();
private CentralProcessor cpu = hal.getProcessor();
long[] prevTicks = new long[TickType.values().length];

public static double getCPU()
{
    double cpuLoad = cpu.getSystemCpuLoadBetweenTicks( prevTicks ) * 100;
    prevTicks = cpu.getSystemCpuLoadTicks();
    System.out.println("cpuLoad : " + cpuLoad);
    return cpuLoad;
}

public static void main(String[] args) throws Exception{
    while(true) {
        // Sleep 20 seconds
        tCPU = (int)getCPU();
    }
}
于 2020-04-11T13:44:04.313 回答
2

我使用以下代码来获取 CPU 负载,它可以在不调用com.sun.*类中的隐藏方法的情况下工作:

public static Double getProcessCpuLoad() {
    try {
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        ObjectName name = ObjectName.getInstance("java.lang:type=OperatingSystem");
        AttributeList list = mbs.getAttributes(name, new String[]{"ProcessCpuLoad"});

        return Optional.ofNullable(list)
                .map(l -> l.isEmpty() ? null : l)
                .map(List::iterator)
                .map(Iterator::next)
                .map(Attribute.class::cast)
                .map(Attribute::getValue)
                .map(Double.class::cast)
                .orElse(null);

    } catch (Exception ex) {
        return null;
    }
}

工作正常,用 JRE 8/11/13 测试。

于 2020-04-02T06:43:32.270 回答