Java i niuchanie po systemie
Jak pobrac, naprzyklad, ilosc wolnej pamieci w systemie operacyjnym, na ktorym uruchomiona jest Javka, srednie wykorzystanie procesora lub jeszcze wolne miejsce na dysku. Mozna roznie, najczesciej korzysta sie ze skryptow, ale co z pure Java? I o tym wlasnie teraz a do pomocy mamy caly package java.lang.management i com.sun.management.
Dla nas najciekawszym bedzie OperatingSystemMXBean, interface umozliwiajacy pobranie info z systemu operacyjnego, na ktorym uruchomiona jest wirtualna maszyna Javy (JVM).
Info o systemie
OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); System.out.println("System: " + osmxb.getName() + " " + osmxb.getVersion() + " (" + osmxb.getArch() + ")"); // System: Linux 2.6.28-15-generic (i386)
Fizyczna
System.out.println("RAM: " + (osmxb.getFreePhysicalMemorySize() / 1024 / 1024) + "/" + (osmxb.getTotalPhysicalMemorySize() / 1024 / 1024) + " MiB"); // RAM: 1454/3277 MiB
Swap
System.out.println("Swap: " + (osmxb.getFreeSwapSpaceSize() / 1024 / 1024) + "/" + (osmxb.getTotalSwapSpaceSize() / 1024 / 1024) + " MiB"); // Swap: 956/956 MiB
Srednie obciazenie
System.out.println("Load: " + osmxb.getSystemLoadAverage()); // Load: 1.41
No i CPU – tu trzeba troche pokombinowac
private static long lastSystemTime = System.nanoTime(); private static long lastProcessCpuTime = 0; private double round(double value, int place) { BigDecimal bd = new BigDecimal(value); bd = bd.setScale(place, BigDecimal.ROUND_UP); return bd.doubleValue(); } public synchronized double getCpuUsage() { long systemTime = System.nanoTime(); long processCpuTime = osmxb.getProcessCpuTime(); double cpuUsage = (double) (processCpuTime - lastProcessCpuTime) / (systemTime - lastSystemTime); lastSystemTime = systemTime; lastProcessCpuTime = processCpuTime; return round(cpuUsage / osmxb.getAvailableProcessors(), 2); } System.out.println("CPU: " + getCpuUsage() + " %"); // CPU: 23.69 %
Wiecej informacji na temat uzytych tu pakietow, mozna uzyskac tutaj i tutaj.
Ups, no tak, a co z miejscem na dyskach?
File path = new File("/"); System.out.println("/: " + (path.getFreeSpace() / 1024 / 1024) + "/" + (path.getTotalSpace() / 1024 / 1024) + " MiB"); // /: 20248/28158 MiB path = new File("/var"); System.out.println("/var: " + (path.getFreeSpace() / 1024 / 1024) + "/" + (path.getTotalSpace() / 1024 / 1024) + " MiB"); // /var: 7174/9852 MiB path = new File("/home"); System.out.println("/home: " + (path.getFreeSpace() / 1024 / 1024) + "/" + (path.getTotalSpace() / 1024 / 1024) + " MiB"); // /home: 20183/56325 MiB
Jezeli /var i /home sa w roocie to dostaniemy wartosci z roota. W windowsie jest podobnie, z ta roznica, ze dyski identyfikujemy jako c:/, d:/.
