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

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

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

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

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

    如果有一个免费的库以可靠的,跨平台的方式完成这项工作,那将是非常好的(即使它可以进行外部调用或使用本机代码本身)。

    任何建议,非常感谢。

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

    SIGAR API提供了我在一个包中查找的所有功能,所以这是迄今为止我的问题的最佳答案。 但是,由于它是根据GPL获得许可的,我不能将其用于我最初的目的(封闭源代码,商业产品)。 Hyperic可能将SIGAR许可用于商业用途,但我没有考虑过它。 对于我的GPL项目,我将来肯定会考虑SIGAR。

    对于我目前的需求,我倾向于以下几点:

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

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

    尽管最初根据GPL授权,但它已更改为Apache 2.0,通常可用于封闭源代码的商业产品。


    沿着我在这篇文章中提到的内容。 我建议你使用SIGAR API。 我在我自己的一个应用程序中使用了SIGAR API,它非常棒。 你会发现它很稳定,得到很好的支持,并且有很多有用的例子。 它采用GPL 2 Apache 2.0许可证开源。 一探究竟。 我有一种感觉会满足你的需求。

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


    以下假设可以得到你的CPU和RAM。 有关更多详细信息,请参阅ManagementFactory。

    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
    }
    

    在JDK 1.7中,可以通过com.sun.management.OperatingSystemMXBean获取系统CPU和内存使用情况。 这与java.lang.management.OperatingSystemMXBean不同。

    long    getCommittedVirtualMemorySize()
    Returns the amount of virtual memory that is guaranteed to be available to the running process in bytes, or -1 if this operation is not supported.
    
    long    getFreePhysicalMemorySize()
    Returns the amount of free physical memory in bytes.
    
    long    getFreeSwapSpaceSize()
    Returns the amount of free swap space in bytes.
    
    double  getProcessCpuLoad()
    Returns the "recent cpu usage" for the Java Virtual Machine process.
    
    long    getProcessCpuTime()
    Returns the CPU time used by the process on which the Java virtual machine is running in nanoseconds.
    
    double  getSystemCpuLoad()
    Returns the "recent cpu usage" for the whole system.
    
    long    getTotalPhysicalMemorySize()
    Returns the total amount of physical memory in bytes.
    
    long    getTotalSwapSpaceSize()
    Returns the total amount of swap space in bytes.
    
    链接地址: http://www.djcxy.com/p/79817.html

    上一篇: How do I monitor the computer's CPU, memory, and disk usage in Java?

    下一篇: How do I determine the size of my array in C?