Как получить использование процессора с помощью java? - PullRequest
2 голосов
/ 02 апреля 2020

Я бы хотел использовать процессор для постоянного обновления базы данных, используя java. На первом l oop этот код читается при правильном использовании процессора. После этого он возвращает неправильные значения меньше 0. Итак, я застрял.

Я использовал jdk 1.8.124.

PLZ, дайте мне знать, как непрерывно получать использование процессора.

lib

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

ср c

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;
        }
  }

}

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Я использую следующий код для загрузки процессора, который работает без вызова скрытых методов в 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.

1 голос
/ 11 апреля 2020

Это делается с помощью Oshi lib.

Я могу получать использование процессора каждые 20 секунд. Lib

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

sr c

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();
    }
}
...