Get OS-level system information Get OS-level system information java java

Get OS-level system information


You can get some limited memory information from the Runtime class. It really isn't exactly what you are looking for, but I thought I would provide it for the sake of completeness. Here is a small example. Edit: You can also get disk usage information from the java.io.File class. The disk space usage stuff requires Java 1.6 or higher.

public class Main {  public static void main(String[] args) {    /* Total number of processors or cores available to the JVM */    System.out.println("Available processors (cores): " +         Runtime.getRuntime().availableProcessors());    /* Total amount of free memory available to the JVM */    System.out.println("Free memory (bytes): " +         Runtime.getRuntime().freeMemory());    /* This will return Long.MAX_VALUE if there is no preset limit */    long maxMemory = Runtime.getRuntime().maxMemory();    /* Maximum amount of memory the JVM will attempt to use */    System.out.println("Maximum memory (bytes): " +         (maxMemory == Long.MAX_VALUE ? "no limit" : maxMemory));    /* Total memory currently available to the JVM */    System.out.println("Total memory available to JVM (bytes): " +         Runtime.getRuntime().totalMemory());    /* Get a list of all filesystem roots on this system */    File[] roots = File.listRoots();    /* For each filesystem root, print some info */    for (File root : roots) {      System.out.println("File system root: " + root.getAbsolutePath());      System.out.println("Total space (bytes): " + root.getTotalSpace());      System.out.println("Free space (bytes): " + root.getFreeSpace());      System.out.println("Usable space (bytes): " + root.getUsableSpace());    }  }}


The java.lang.management package does give you a whole lot more info than Runtime - for example it will give you heap memory (ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()) separate from non-heap memory (ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()).

You can also get process CPU usage (without writing your own JNI code), but you need to cast the java.lang.management.OperatingSystemMXBean to a com.sun.management.OperatingSystemMXBean. This works on Windows and Linux, I haven't tested it elsewhere.

For example ... call the get getCpuUsage() method more frequently to get more accurate readings.

public class PerformanceMonitor {     private int  availableProcessors = getOperatingSystemMXBean().getAvailableProcessors();    private long lastSystemTime      = 0;    private long lastProcessCpuTime  = 0;    public synchronized double getCpuUsage()    {        if ( lastSystemTime == 0 )        {            baselineCounters();            return;        }        long systemTime     = System.nanoTime();        long processCpuTime = 0;        if ( getOperatingSystemMXBean() instanceof OperatingSystemMXBean )        {            processCpuTime = ( (OperatingSystemMXBean) getOperatingSystemMXBean() ).getProcessCpuTime();        }        double cpuUsage = (double) ( processCpuTime - lastProcessCpuTime ) / ( systemTime - lastSystemTime );        lastSystemTime     = systemTime;        lastProcessCpuTime = processCpuTime;        return cpuUsage / availableProcessors;    }    private void baselineCounters()    {        lastSystemTime = System.nanoTime();        if ( getOperatingSystemMXBean() instanceof OperatingSystemMXBean )        {            lastProcessCpuTime = ( (OperatingSystemMXBean) getOperatingSystemMXBean() ).getProcessCpuTime();        }    }}


I think the best method out there is to implement the SIGAR API by Hyperic. It works for most of the major operating systems ( darn near anything modern ) and is very easy to work with. The developer(s) are very responsive on their forum and mailing lists. I also like that it is GPL2 Apache licensed. They provide a ton of examples in Java too!

SIGAR == System Information, Gathering And Reporting tool.