如何在 Java 中监视计算机的 CPU、内存和磁盘使用情况?

2022-08-31 06:15:22

我想在Java中监视以下系统信息:

  • 当前 CPU 使用率**(百分比)
  • 可用内存*(可用/总内存)
  • 可用磁盘空间(可用/总计)

    *请注意,我的意思是整个系统可用的总内存,而不仅仅是JVM。

我正在寻找一种跨平台解决方案(Linux,Mac和Windows),它不依赖于我自己的代码调用外部程序或使用JNI。虽然这些都是可行的选择,但如果有人已经有了更好的解决方案,我宁愿自己不维护特定于操作系统的代码。

如果有一个免费的库以可靠的跨平台方式做到这一点,那就太好了(即使它进行外部调用或使用本机代码本身)。

任何建议都非常感谢。

为了澄清,我想获得整个系统的当前CPU使用率,而不仅仅是Java进程。

SIGAR API在一个软件包中提供了我正在寻找的所有功能,因此到目前为止,它是我问题的最佳答案。但是,由于它是根据GPL许可的,我不能将其用于我的原始目的(闭源,商业产品)。Hyperic可能会将SIGAR许可用于商业用途,但我还没有研究过。对于我的GPL项目,我将来肯定会考虑SIGAR。

对于我目前的需求,我倾向于以下内容:

  • 对于 CPU 使用率(每个 CPU 的平均负载)OperatingSystemMXBean.getSystemLoadAverage() / OperatingSystemMXBean.getAvailableProcessors()
  • 用于内存,以及OperatingSystemMXBean.getTotalPhysicalMemorySize()OperatingSystemMXBean.getFreePhysicalMemorySize()
  • 对于磁盘空间,以及File.getTotalSpace()File.getUsableSpace()

局限性:

和磁盘空间查询方法仅在 Java 6 下可用。此外,某些 JMX 功能可能并非对所有平台都可用(即,据报道,在 Windows 上返回 -1)。getSystemLoadAverage()getSystemLoadAverage()

虽然最初是在GPL下授权的,但它已经改为Apache 2.0,它通常可以用于闭源商业产品。


答案 1

按照我在这篇文章中提到的内容。我建议你使用SIGAR API。我在自己的一个应用程序中使用SIGAR API,它很棒。你会发现它是稳定的,很好的支持,并且充满了有用的例子。它是开源的,具有GPL 2 Apache 2.0许可证。来看看吧。我有一种感觉,它会满足你的需求。

使用Java和Sigar API,您可以获得内存,CPU,磁盘,平均负载,网络接口信息和指标,进程表信息,路由信息等。


答案 2

以下据说可以获得CPU和RAM。有关更多详细信息,请参阅管理工厂

import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

private static void printUsage() {
  OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
  for (Method method : operatingSystemMXBean.getClass().getDeclaredMethods()) {
    method.setAccessible(true);
    if (method.getName().startsWith("get")
        && Modifier.isPublic(method.getModifiers())) {
            Object value;
        try {
            value = method.invoke(operatingSystemMXBean);
        } catch (Exception e) {
            value = e;
        } // try
        System.out.println(method.getName() + " = " + value);
    } // if
  } // for
}