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

I would like to monitor the following system information in Java:

  • Current CPU usage** (percent)
  • Available memory* (free/total)
  • Available disk space (free/total)

    *Note that I mean overall memory available to the whole system, not just the JVM.

  • I'm looking for a cross-platform solution (Linux, Mac, and Windows) that doesn't rely on my own code calling external programs or using JNI. Although these are viable options, I would prefer not to maintain OS-specific code myself if someone already has a better solution.

    If there's a free library out there that does this in a reliable, cross-platform manner, that would be great (even if it makes external calls or uses native code itself).

    Any suggestions are much appreciated.

    To clarify, I would like to get the current CPU usage for the whole system, not just the Java process(es).

    The SIGAR API provides all the functionality I'm looking for in one package, so it's the best answer to my question so far. However, due it being licensed under the GPL, I cannot use it for my original purpose (a closed source, commercial product). It's possible that Hyperic may license SIGAR for commercial use, but I haven't looked into it. For my GPL projects, I will definitely consider SIGAR in the future.

    For my current needs, I'm leaning towards the following:

  • For CPU usage, OperatingSystemMXBean.getSystemLoadAverage() / OperatingSystemMXBean.getAvailableProcessors() (load average per cpu)
  • For memory, OperatingSystemMXBean.getTotalPhysicalMemorySize() and OperatingSystemMXBean.getFreePhysicalMemorySize()
  • For disk space, File.getTotalSpace() and File.getUsableSpace()
  • Limitations:

    The getSystemLoadAverage() and disk space querying methods are only available under Java 6. Also, some JMX functionality may not be available to all platforms (ie it's been reported that getSystemLoadAverage() returns -1 on Windows).

    Although originally licensed under GPL, it has been changed to Apache 2.0, which can generally be used for closed source, commercial products.


    Along the lines of what I mentioned in this post. I recommend you use the SIGAR API. I use the SIGAR API in one of my own applications and it is great. You'll find it is stable, well supported, and full of useful examples. It is open-source with a GPL 2 Apache 2.0 license. Check it out. I have a feeling it will meet your needs.

    Using Java and the Sigar API you can get Memory, CPU, Disk, Load-Average, Network Interface info and metrics, Process Table information, Route info, etc.


    The following supposedly gets you CPU and RAM. See ManagementFactory for more details.

    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
    }
    

    In JDK 1.7, you can get system CPU and memory usage via com.sun.management.OperatingSystemMXBean . This is different than 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/79818.html

    上一篇: 如何确定机器上的硬件(CPU和RAM)?

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