2013-08-28 6 views
19

Voglio calcolare la percentuale di utilizzo della CPU del sistema operativo dal codice java.Come ottenere la percentuale di utilizzo della CPU del sistema operativo da java

  1. Esistono diversi modi per trovarlo tramite il comando unix [ad es. utilizzando mpstat, /proc/stat ecc ...] e utilizzarlo da Runtime.getRuntime().exec

Ma io non voglio usare le chiamate di sistema.

ho cercato ManagementFactory.getOperatingSystemMXBean()

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

ma dà il carico della CPU, ma non l'utilizzo della CPU. Esiste comunque la percentuale di utilizzo?

+0

Puoi collegare a Javadoc per la 'OperatingSystemMXBean' per favore? La percentuale è calcolata dal carico o viceversa? Non lo so, ma potrebbe essere. – Freiheit

+3

No. Il carico non ha nulla a che vedere con la percentuale. [wiki] (http://en.wikipedia.org/wiki/Load_%28computing%29) e [javadoc] (http://docs.oracle.com/javase/6/docs/api/java/lang/management /OperatingSystemMXBean.html) –

risposta

0

È possibile utilizzare SIGAR API. È multipiattaforma (ma l'ho usato solo su Windows).

Il Javadoc è disponibile here ei binari sono here

Si è concesso in licenza sotto i termini della licenza Apache 2.0.

+0

Grazie! Ma in javadoc di questa API vedo solo "Get the Total system cpu time" e non l'uso di sotto della classe Cpu. Potete indicarmi dove posso ottenere l'utilizzo della CPU? –

+0

Se hai scaricato Sigar da SourceForge, dovresti trovare diversi esempi disponibili a hyperic-sigar-1.6.4 \ bindings \ java \ examples \. Penso che CpuInfo.java o Top.java potrebbe essere quello che stai cercando. – Julien

+0

Sembra che nulla più tardi di Ubuntu 9 sia certificato per le API SIGAR come da sito. Questo dovrebbe essere un problema? –

32

In Java 7 è possibile ottenere in questo modo:

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

Funziona solo su determinati sistemi operativi? Eseguendo Java 7u15 su Windows 7 a 64 bit, viene restituito 'NaN', poiché' value' è negativo. – Vulcan

+0

Dovrebbe funzionare su tutti. L'ho provato su Windows 7 Java7u51 a 64 bit e funziona benissimo dopo pochi secondi. I primi secondi restituiscono -1,0 perché richiede un po 'di tempo per inizializzare alcuni oggetti/valori. – isapir

+1

Interessante, sembra che ci voglia circa un secondo sulla mia macchina affinché il carico della CPU sia un valore reale. Grazie per il chiarimento. +1 – Vulcan