Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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使用率?_Java_Cpu Usage_Oshi - Fatal编程技术网

如何使用java获取cpu使用率?

如何使用java获取cpu使用率?,java,cpu-usage,oshi,Java,Cpu Usage,Oshi,我想让cpu使用率不断地使用java更新我的数据库。 在第一个循环中,通过正确的cpu使用,可以读取该代码。 然后,它返回小于0的错误值。 所以,我结巴了 我使用了JDK1.8.124 请告诉我如何持续获取cpu使用率 解放党 src 我使用以下代码来获取CPU负载,它不需要调用com.sun.*类中的隐藏方法: public static Double getProcessCpuLoad() { try { MBeanServer mbs = ManagementFac

我想让cpu使用率不断地使用java更新我的数据库。 在第一个循环中,通过正确的cpu使用,可以读取该代码。 然后,它返回小于0的错误值。 所以,我结巴了

我使用了JDK1.8.124

请告诉我如何持续获取cpu使用率

解放党

src


我使用以下代码来获取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进行测试。

使用Oshi lib完成

我可以每20秒获得一次cpu使用率 解放党

src


为什么不使用Dropwizard Metrics或Millimer之类的库呢?下面的URL可能会有所帮助@板球我会做的@서민봉明邦达维迪塞해봤는데, 안됩니다. 일단 中央处理器사용률 값들이 작업관리자에 나오는 값들과 매칭되질 않아요. 분명 中央处理器사용률은 80%이상 올라가 있음에도 불구하고 12%로 계속 뜬다거나, SIGAR API는 특정 컴퓨터에서는 에러 로그만 작성되고 정상적으로 돌지 않습니다. (窗户환경인데 원보드 타입의 개발보드 (原子处理器)에서는 특히 작동을 안해요) 다른 것들도 첫번째에서만 제대로된 답을 내놓고 두번째 아웃풋부터는 소숫점 이하의 값을 결과로 보여줍니다 ㅠㅠ=> 我试过了,但仍然不起作用。CPU使用率值与任务管理器中的值不匹配。显然,即使CPU使用率已上升到80%以上,它仍指示约12%。在某些计算机上使用sigar API生成错误日志文件,然后关闭。(在它测试的windows环境中,它不工作,特别是在开发板(ATOM处理器)上)。大多数示例代码仅在第一次给出正确答案。其他输出与您的代码相加的结果仍然较少。然后将getProcessCpuLoad乘以10。这是它的结果:7.243884075601578 0.630612162235574 0.12868694055771907 0.1289446372052992 0.12908448934655176 0.06456270743097 0.128457901733678 0.064630120467704 0.12915222118015093它仍然不工作。:(为什么要乘以10而不是乘以100(到%值)?值看起来还可以-您的期望是什么?这是我的输入错误。我乘以了100。因此7.243884075601578看起来是正确的答案,但其余的答案都不好。在我的任务管理器上,CPU使用率在第一次回答时超过30%。那么,您能给我更多关于这个导入库的信息吗?
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;
        }
  }

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