2013-08-28 17 views
19

İşletim sistemi CPU kullanım yüzdesini java kodundan hesaplamak istiyorum.İşletim sisteminin CPU kullanım yüzdesini java'dan nasıl edinilir

  1. unix komutuyla bulmak için birkaç yol vardır [ör. /proc/stat vs ...], mpstat kullanarak ve Runtime.getRuntime().exec

onu kullanmak Ama sistem çağrıları kullanmak istemiyoruz.

Ben

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

ManagementFactory.getOperatingSystemMXBean() çalıştı Ama cpu yükü ancak cpu kullanımı verir. Kullanım yüzdesini bulmak için zaten var mı?

+0

Eğer 'OperatingSystemMXBean' lütfen için Javadoc bağlanabilir miyim? Yüzde yükten mi hesaplanıyor, tersi mi? Bilmiyorum ama olabilir. – Freiheit

+3

No. Yük, yüzde ile ilgisi yoktur. [wiki] (http://en.wikipedia.org/wiki/Load_%28computing%29) ve [javadoc] (http://docs.oracle.com/javase/6/docs/api/java/lang/management /OperatingSystemMXBean.html) –

cevap

0

SIGAR API'u kullanabilirsiniz. Çapraz platform (ama sadece Windows'ta kullanıyorum).

Javadoc here mevcuttur ve ikili here

Apache 2.0 lisansı şartları altında lisanslıdır vardır.

+0

Teşekkürler! Ancak bu API'nın javadoc'unda Cpu sınıfında kullanımı değil sadece "Toplam sistem işlemci zamanını al" ifadesini görüyorum. CPU kullanımını nereden bulabilirim? –

+0

SourceForge'dan Sigar'ı indirdiyseniz, hyperic-sigar-1.6.4 \ bindings \ java \ samples \ 'de birkaç örnek bulabilirsiniz. CpuInfo.java veya Top.java'nın aradığınız şey olabileceğini düşünüyorum. – Julien

+0

Ubuntu 9'un SIGAR API için siteye göre sertifikalandırılmasından daha geç bir şey yok gibi görünüyor. Bu bir sorun mu olmalı? –

32

Java 7'de bunu gibi alabilirsiniz:

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

Bu yalnızca belirli işletim sistemlerinde çalışır mı? Java 7u15'in 64bit Windows 7'de çalıştırılması, 'NaN',' value' negatif olarak döndürülür. – Vulcan

+0

Her şey üzerinde çalışmalı. Window 7 Java7u51 64bit üzerinde test ettim ve birkaç saniye sonra iyi çalışıyor. İlk birkaç saniye -1.0 değerini döndürür çünkü bazı nesnelerin/değerlerin başlatılması biraz zaman alır. – isapir

+1

İlginç, CPU yükünün gerçek bir değer olması için makinemde yaklaşık bir saniye sürüyor. Açıklama için teşekkürler. +1 – Vulcan

İlgili konular