Get OS-level system information

后端 未结 16 1730
情话喂你
情话喂你 2020-11-22 02:02

I\'m currently building a Java app that could end up being run on many different platforms, but primarily variants of Solaris, Linux and Windows.

Has anyone been abl

相关标签:
16条回答
  • 2020-11-22 02:29

    One simple way which can be used to get the OS level information and I tested in my Mac which works well :

     OperatingSystemMXBean osBean =
            (OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();
        return osBean.getProcessCpuLoad();
    

    You can find many relevant metrics of the operating system here

    0 讨论(0)
  • 2020-11-22 02:31

    If you are using Jrockit VM then here is an other way of getting VM CPU usage. Runtime bean can also give you CPU load per processor. I have used this only on Red Hat Linux to observer Tomcat performance. You have to enable JMX remote in catalina.sh for this to work.

    JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://my.tomcat.host:8080/jmxrmi");
    JMXConnector jmxc = JMXConnectorFactory.connect(url, null);     
    MBeanServerConnection conn = jmxc.getMBeanServerConnection();       
    ObjectName name = new ObjectName("oracle.jrockit.management:type=Runtime");
    Double jvmCpuLoad =(Double)conn.getAttribute(name, "VMGeneratedCPULoad");
    
    0 讨论(0)
  • 2020-11-22 02:34

    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();
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-22 02:36

    You can get some system-level information by using System.getenv(), passing the relevant environment variable name as a parameter. For example, on Windows:

    System.getenv("PROCESSOR_IDENTIFIER")
    System.getenv("PROCESSOR_ARCHITECTURE")
    System.getenv("PROCESSOR_ARCHITEW6432")
    System.getenv("NUMBER_OF_PROCESSORS")
    

    For other operating systems the presence/absence and names of the relevant environment variables will differ.

    0 讨论(0)
  • 2020-11-22 02:37

    It is still under development but you can already use jHardware

    It is a simple library that scraps system data using Java. It works in both Linux and Windows.

    ProcessorInfo info = HardwareInfo.getProcessorInfo();
    //Get named info
    System.out.println("Cache size: " + info.getCacheSize());        
    System.out.println("Family: " + info.getFamily());
    System.out.println("Speed (Mhz): " + info.getMhz());
    //[...]
    
    0 讨论(0)
  • 2020-11-22 02:38

    Hey you can do this with java/com integration. By accessing WMI features you can get all the information.

    0 讨论(0)
提交回复
热议问题