2013-11-05 10 views
7

Próbuję użyć języka Java, aby uzyskać procent procesora używanego przez aktualnie działającą wirtualną maszynę Java. Moje badania wskazały mi na używanie klasy com.sun.management.OperatingSystemMXBean. Poniższe przykłady online Pisałem następujące:Używanie OperatingSystemMXBean do pobrania procesora

import java.lang.management.ManagementFactory; 
import com.sun.management.OperatingSystemMXBean; 


public class TestClass { 

public static void main (String[] args) { 
    OperatingSystemMXBean bean = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); 

    System.out.println(bean.getProcessCpuLoad()); 
    System.out.println(bean.getSystemCpuLoad()); 

    } 

} 

Po przetestowaniu tego na dwóch komputerach, nie mogę powstrzymać się wyniku -1.0 dla obu połączeń. Próbowałem uruchomić ten kod przy użyciu zarówno 64- jak i 32-bitowych wersji Java 7 i 6 za pomocą różnych metod. Mimo to, wszystko mogę to wydruk z -1.0 które according to the Javadocs,

All values betweens 0.0 and 1.0 are possible depending of the activities going on in the system. If the system recent cpu usage is not available, the method returns a negative value.

nie wiem co jeszcze do zrobienia. Założenie obciążenia procesora jest krytyczne i chciałbym uniknąć użycia innej biblioteki, takiej jak Sigar. Czy ktoś ma jakieś zalecenia lub ma jakiś wgląd w ten problem?

Odpowiedz

21

Po prostu odpowiadam na moje własne pytanie, na wypadek gdyby ktoś mógł pomóc.

To, co robiłem, było technicznie poprawne, jednak nie dałem wystarczającej ilości czasu na zbieranie informacji o wykorzystaniu procesora przez OperatingSystemMXBean. JVM musi faktycznie działać przez kilka sekund, zanim będzie mogła zebrać informacje o użyciu procesora, a wtedy rozdzielczość odświeżania zależy od implementacji.

Uruchamianie kodu z następującą zmianą zacznie produkować informacje o użytkowaniu po ~ 2 sekund na moim komputerze:

public static void main(String[] args) { 
    OperatingSystemMXBean bean = (com.sun.management.OperatingSystemMXBean) ManagementFactory 
      .getOperatingSystemMXBean(); 

    while (true) { 
     System.out.println(bean.getProcessCpuLoad()); 
     System.out.println(bean.getSystemCpuLoad()); 
    } 

} 

Mam nadzieję, że może to pomóc komuś

+0

Dziękuję za tę odpowiedź, ale zauważyli, że działa ten kod zwiększa wykorzystanie procesora o 30-40%. Oznacza to, że uzyskujemy zwiększone wykorzystanie procesora za każdym razem, gdy uruchamiamy ten kod. –

+3

@Shashank Ten kod ma na celu jedynie zademonstrowanie opóźnienia w pobieraniu informacji o użyciu procesora. W prawdziwym systemie nie powinieneś wykonywać tego połączenia w nieskończonej pętli. Wystarczy raz na przypadek użycia wystarczy po kilku chwilach działania aplikacji. – Kon

+0

Nawet uruchomienie tego kodu przez 1-2 sekundy zwiększa użycie procesora. –

Powiązane problemy