为什么getSystemCpuLoad()返回负值

3
我需要使用Java获取CPU使用率内存使用率。找到了com.sun.management.OperatingSystemMXBeangetSystemCpuLoad()。根据文档,它返回0.0到1.0之间的值。但我总是得到-1。根据文档,当值不可用时会返回此值。但为什么它总是返回负值呢?是否有任何属性需要更改以获取正确的值?
如果没有,希望有人能建议其他方法来获取CPU使用率和内存使用率。
我的代码包括:
OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
System.out.println(operatingSystemMXBean.getSystemCpuLoad());

2
getProcessCpuLoad 返回什么?这可能是一个权限问题。 - Kayaman
我们能看一下你是如何调用/使用它的吗? - ΦXocę 웃 Пepeúpa ツ
文档确实说“如果不可用,则返回负值。”问题是您正在运行什么样的平台,以及运行什么种类/版本的JVM。 - nos
1
GetLastError 代表什么意思? - rustyx
@Kayaman - getProcessCpuLoad也会返回-1.0。 - udani
显示剩余3条评论
1个回答

1
com.sun.management.OperatingSystemMXBean的文档只说明,如果无法访问信息,则该方法返回负值出于某种原因。例如,这可能是因为数据尚不可用或者您没有检索此信息所需的权限
OperatingSystemMXBean 似乎需要一些时间来收集数据,然后才能开始返回有用的内容。

以下代码展示了如何测试这种现象。

OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
long t = System.currentTimeMillis();
while(System.currentTimeMillis() < t + 5000) {
  System.out.println(operatingSystemMXBean.getSystemCpuLoad());
  TimeUnit.SECONDS.sleep(1);
}

我个人经历过的一件事是,当这个函数被一个不属于性能日志用户性能监视器用户组的用户作为Windows服务执行时,函数总是会返回-1,因为用户没有必要的特权(在最后进行的系统调用中需要特权)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接