如何使用 Java 11 获取 CPU 利用率

Ron*_*adi 5 java cpu-usage java-11

我正在尝试使用 Java 11 获取 CPU 利用率或使用情况。

我的期望是总使用量的平均百分比,我对 CPU 上可用的核心或线程的数量没有任何兴趣。

简单来说,80% 时 CPU 非常繁忙,10% 时或多或少处于空闲状态。

我如何得到这个?

我一直在尝试 stackoverflow 上的一些建议。

选项1.使用com.sun.management.OperatingSystemMXBean不好,什么都好com.sun都是旧的,应该避免。

选项2。有一个第3方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()));
    }
Run Code Online (Sandbox Code Playgroud)

选项3.内置于Java内部java.lang.management.OperatingSystemMXBean。此选项的问题在于它osBean.getSystemLoadAverage()是一个double值。当我的CPU不忙时〜1.3,当我的CPU忙时达到〜2.9。回报。osBean.getAvailableProcessors()8我很确定它是英特尔四核,共有 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;
        
    }

Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 7

随着模块系统的引入,类型com.sun.management.OperatingSystemMXBean已经成为官方API的一部分,但是对于模块化软件来说,必须有对模块的声明依赖jdk.management而不仅仅是java.management.

\n

这样就可以正式使用了

\n
double cpuLoad = ManagementFactory.getPlatformMXBean(\n    com.sun.management.OperatingSystemMXBean.class).getCpuLoad();\n
Run Code Online (Sandbox Code Playgroud)\n

但它\xe2\x80\x99s也可以动态访问JMX属性,以避免强烈的代码依赖性:

\n
try {\n    double cpuLoad = (Double)ManagementFactory.getPlatformMBeanServer()\n        .getAttribute(new ObjectName("java.lang:type=OperatingSystem"), "CpuLoad");\n    \xe2\x80\xa6\n} catch (JMException ex) {\n    System.getLogger(CPULoad.class.getName()).log(System.Logger.Level.ERROR, "", ex);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在 JDK\xc2\xa014 之前,请使用getSystemCpuLoad()"SystemCpuLoad"代替getCpuLoad()resp。"CpuLoad"

\n

这不会强制扩展可用,而是在可用时使用它。

\n
\n

简单来说,系统平均负载就是竞争CPU的进程的平均数量因此,对于单 CPU 系统,您可以说,值大于 1 不仅意味着 CPU 完全繁忙,而且可运行任务在可用时会使用更多的 CPU 资源。

\n

对于n 个CPU 或内核,当系统负载达到值n时,您可以说类似的话,但请注意这只是平均值。因此,负载值为n时,仍然可能出现峰值负载,其中超过n 个应用程序竞争 CPU,然后出现 CPU 核心利用率不足的情况。但如果有足够的样本值或足够高的采样率,您可以说n或更高的值意味着 CPU 使用饱和。

\n