2013-08-28 12 views
19

Chcę obliczyć procent wykorzystania procesora systemu operacyjnego z kodu Java.Jak uzyskać procent wykorzystania procesora systemu operacyjnego z poziomu java

  1. Istnieje kilka sposobów na znalezienie go za pomocą polecenia unix [np. stosując mpstat, /proc/stat etc ...] i użyć go z Runtime.getRuntime().exec

Ale nie chcą korzystać z wywołań systemowych.

Próbowałem ManagementFactory.getOperatingSystemMXBean()

OperatingSystemMXBean osBean = 
     (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); 
System.out.println(osBean.getSystemLoadAverage()); 

Ale daje obciążenie procesora, ale nie użycie procesora. Czy mimo to można znaleźć procent użycia?

+0

można połączyć do Javadoc dla 'OperatingSystemMXBean' proszę? Czy procent oblicza się na podstawie obciążenia lub na odwrót? Nie wiem, ale może tak być. – Freiheit

+3

Nie. Ładunek nie ma nic wspólnego z procentami. [wiki] (http://en.wikipedia.org/wiki/Load_%28computing%29) i [javadoc] (http://docs.oracle.com/javase/6/docs/api/java/lang/management /OperatingSystemMXBean.html) –

Odpowiedz

0

Możesz użyć SIGAR API. Jest to platforma krzyżowa (ale używam jej tylko w systemie Windows).

Javadoc jest dostępny here i pliki binarne są here

jest licencjonowana na warunkach licencji Apache 2.0.

+0

Dzięki! Ale w javadoc tego API widzę tylko "Get the Total system cpu time", a nie użycie w klasie Cpu. Czy możesz wskazać mi, gdzie mogę uzyskać użycie procesora? –

+0

Jeśli pobrałeś Sigar z SourceForge, powinieneś znaleźć kilka przykładów dostępnych w hyperic-sigar-1.6.4 \ bindings \ java \ examples \. Myślę, że CpuInfo.java lub Top.java mogą być tym, czego szukasz. – Julien

+0

Wygląda na to, że nie później niż Ubuntu 9 ma certyfikat API SIGAR, jak na stronie. Czy to powinien być problem? –

32

W Javie 7 można dostać go tak:

public static double getProcessCpuLoad() throws Exception { 

    MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); 
    ObjectName name = ObjectName.getInstance("java.lang:type=OperatingSystem"); 
    AttributeList list = mbs.getAttributes(name, new String[]{ "ProcessCpuLoad" }); 

    if (list.isEmpty())  return Double.NaN; 

    Attribute att = (Attribute)list.get(0); 
    Double value = (Double)att.getValue(); 

    // usually takes a couple of seconds before we get real values 
    if (value == -1.0)  return Double.NaN; 
    // returns a percentage value with 1 decimal point precision 
    return ((int)(value * 1000)/10.0); 
} 
+0

Czy działa to tylko w niektórych systemach operacyjnych? Uruchamiając Javę 7u15 na 64-bitowym Windows 7, zwracane jest 'NaN', ponieważ' wartość' jest ujemna. – Vulcan

+0

Powinien działać na wszystkich. Przetestowałem to na Windows 7 Java7u51 64bit i działa dobrze po kilku sekundach. Pierwsze kilka sekund zwraca wartość -1.0, ponieważ inicjalizacja niektórych obiektów/wartości zajmuje trochę czasu. – isapir

+1

Interesujące, wydaje się, że zajmuje około jednej sekundy na moim komputerze, aby obciążenie procesora było rzeczywistą wartością. Dziękuję za wyjaśnienie. +1 – Vulcan

Powiązane problemy