如何从Java中获取操作系统的CPU使用百分比

28

我想从Java代码中计算操作系统CPU使用百分比。

  1. 有几种方法可以通过Unix命令找到它 [例如,使用mpstat/proc/stat等...]并使用Runtime.getRuntime().exec从中使用。

但是我不想使用系统调用。

我尝试过ManagementFactory.getOperatingSystemMXBean()

OperatingSystemMXBean osBean =
         (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
System.out.println(osBean.getSystemLoadAverage());

但它只给出了CPU负载而没有CPU使用率。有没有办法找到使用百分比?


请问您能否提供OperatingSystemMXBean的Javadoc链接?百分比是从负载计算出来的还是反过来?我不确定,但可能是这样。 - Freiheit
4
负载与百分比无关。wikijavadoc - G.S
2个回答

43

在Java 7中,您可以这样获取它:

public static double getProcessCpuLoad() throws Exception {

    MBeanServer mbs    = ManagementFactory.getPlatformMBeanServer();
    ObjectName name    = ObjectName.getInstance("java.lang:type=OperatingSystem");
    AttributeList list = mbs.getAttributes(name, new String[]{ "ProcessCpuLoad" });

    if (list.isEmpty())     return Double.NaN;

    Attribute att = (Attribute)list.get(0);
    Double value  = (Double)att.getValue();

    // usually takes a couple of seconds before we get real values
    if (value == -1.0)      return Double.NaN;
    // returns a percentage value with 1 decimal point precision
    return ((int)(value * 1000) / 10.0);
}

这只在特定的操作系统上工作吗?在64位Windows 7上运行Java 7u15时,由于'value'为负一,因此返回NaN。 - FThompson
它应该在所有设备上都能运行。我在Windows 7 Java7u51 64位上进行了测试,几秒钟后它可以正常工作。前几秒钟返回-1.0是因为需要一些时间来初始化某些对象/值。 - isapir
1
有趣的是,在我的机器上,CPU负载需要大约一秒钟的时间才能成为实际值。感谢澄清。+1 - FThompson
2
我在代码中添加了一条注释,以便为将来可能不会阅读此处评论的用户进行澄清。 - isapir
10
ProcessCpuLoad是该JVM系统的%CPU负载,还有SystemCpuLoad可以给出整个系统的负载。您是否尝试在循环中调用它?我注意到前几次调用返回-1.0。 - isapir
显示剩余6条评论

0

您可以使用SIGAR API。它是跨平台的(但我只在Windows上使用过)。

Javadoc可在此处获得,二进制文件可在此处获得。

它根据Apache 2.0许可条款授权。


谢谢!但是在这个 API 的 javadoc 中,我只看到“获取总系统 CPU 时间”,而不是在 Cpu 类下的使用情况。你能告诉我去哪里找到 CPU 使用率吗? - G.S
如果您已经从SourceForge下载了Sigar,那么您应该可以在hyperic-sigar-1.6.4\bindings\java\examples\找到几个示例。我认为CpuInfo.java或Top.java可能是您要寻找的内容。 - Julien
根据该网站,似乎只有Ubuntu 9及更早版本才获得了SIGAR API的认证。这会成为问题吗? - Shivaji_Vidhale
1
我们需要考虑到 SIGAR 会导致 JVM 崩溃的情况。在生产环境中严禁使用。 - AKS
SIGAR的链接已经失效了。这个项目也死了吗?或者被VMware收购了,根据第二个链接来看。 - Fractaly

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