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)
随着模块系统的引入,类型com.sun.management.OperatingSystemMXBean已经成为官方API的一部分,但是对于模块化软件来说,必须有对模块的声明依赖jdk.management而不仅仅是java.management.
这样就可以正式使用了
\ndouble cpuLoad = ManagementFactory.getPlatformMXBean(\n com.sun.management.OperatingSystemMXBean.class).getCpuLoad();\nRun Code Online (Sandbox Code Playgroud)\n但它\xe2\x80\x99s也可以动态访问JMX属性,以避免强烈的代码依赖性:
\ntry {\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}\nRun Code Online (Sandbox Code Playgroud)\n在 JDK\xc2\xa014 之前,请使用getSystemCpuLoad()或"SystemCpuLoad"代替getCpuLoad()resp。"CpuLoad"
这不会强制扩展可用,而是在可用时使用它。
\n简单来说,系统平均负载就是竞争CPU的进程的平均数量。因此,对于单 CPU 系统,您可以说,值大于 1 不仅意味着 CPU 完全繁忙,而且可运行任务在可用时会使用更多的 CPU 资源。
\n对于n 个CPU 或内核,当系统负载达到值n时,您可以说类似的话,但请注意这只是平均值。因此,负载值为n时,仍然可能出现峰值负载,其中超过n 个应用程序竞争 CPU,然后出现 CPU 核心利用率不足的情况。但如果有足够的样本值或足够高的采样率,您可以说n或更高的值意味着 CPU 使用饱和。
\n| 归档时间: |
|
| 查看次数: |
6474 次 |
| 最近记录: |