2010-01-14 41 views

Respuesta

1

Tal vez, si está atascado, podría "detectar" la disponibilidad de la CPU ejecutando una calculadora intermitente de bogomips en una cadena de fondo, y suavizando y normalizando sus hallazgos. ... vale la pena intentarlo no?

+0

Esta es una idea razonable. Sin embargo, tendrá que usar trucos microbenchmark adecuados (ejecutar durante un período de tiempo prolongado, calentar todos los bucles antes del tiempo, usar 'System.nanoTime()'). Todavía habrá un poco de revoloteo en el rendimiento también en el intervalo de tiempo. – BobMcGee

10

No es una joya en los comentarios sobre el artículo que vincula kgiannakakis:

javasysmon

JavaSysMon gestiona procesos y informes de rendimiento útil del sistema métricas de plataforma cruzada. Puede pensar en como una versión multiplataforma de el comando 'superior' de UNIX, junto con la capacidad de eliminar procesos. Se presenta en la forma de un único archivo JAR/..

-obras en Windows, Mac OS X, Linux y Solaris.

7

¿Qué le parece usar jmx mbeans?

final OperatingSystemMXBean myOsBean= 
      ManagementFactory.getOperatingSystemMXBean(); 
double load = myOsBean.getSystemLoadAverage(); 
+5

Da -1 para mí en plataformas Windows. –

+0

documentos dice -1 significa que no es compatible. Pero en Linux obtengo un valor inferior a lo que dice el sistema operativo, así que supongo que es la carga de CPU utilizada por la JVM actual. – tgkprog

+0

ref doc http://docs.oracle.com/javase/6/docs/api/java/lang/management/OperatingSystemMXBean.html – tgkprog

5

Usted puede utilizar granos de JMX para calcular una carga de la CPU. Tenga en cuenta que esto mide la carga de la CPU de su programa Java, no la carga total del sistema. (La pregunta no especificó cuál)

Inicializar:

ThreadMXBean newBean = ManagementFactory.getThreadMXBean(); 
    try 
    { 
     if (this.newBean.isThreadCpuTimeSupported()) 
      this.newBean.setThreadCpuTimeEnabled(true); 
     else 
      throw new AccessControlException(""); 
    } 
    catch (AccessControlException e) 
    { 
     System.out.println("CPU Usage monitoring is not available!"); 
     System.exit(0); 
    } 

Entonces, como el bucle (suponiendo que la aplicación utiliza un bucle, de lo contrario lo que es el punto de medición de uso de la CPU?) Usar esto:

long lastTime = System.nanoTime(); 
    long lastThreadTime = newBean.getCurrentThreadCpuTime(); 

    while (true) 
    { 
     // Do something that takes at least 10ms (on windows) 
     try 
     { 
      int j = 0; 
      for (int i = 0; i < 20000000; i++) 
       j = (j + i) * j/2; 
      Thread.sleep(100); 
     } 
     catch (InterruptedException e) 
     { 
     } 

     // Calculate coarse CPU usage: 
     long time = System.nanoTime(); 
     long threadTime = newBean.getCurrentThreadCpuTime(); 
     double load = (threadTime - lastThreadTime)/(double)(time - lastTime); 
     System.out.println((float)load); 

     // For next iteration. 
     lastTime = time; 
     lastThreadTime = threadTime; 
    } 

es necesario utilizar doble precisión debido a un largo no encaja en un flotador (aunque podría trabajar 99.9999999999999999% de las veces)

Si el "algo" que está haciendo toma menos de aproximadamente 1.6ms (Windows), entonces el valor devuelto ni siquiera habrá aumentado y siempre medirá 0% de CPU erróneamente.

Debido getCurrentThreadCpuTime es muy inexacta (con retrasos de menos de 100 ms), alisando ayuda mucho:

long lastTime = System.nanoTime(); 
    long lastThreadTime = newBean.getCurrentThreadCpuTime(); 

    float smoothLoad = 0; 
    while (true) 
    { 
     // Do something that takes at least 10ms (on windows) 
     try 
     { 
      int j = 0; 
      for (int i = 0; i < 2000000; i++) 
       j = (j + i) * j/2; 
      Thread.sleep(10); 
     } 
     catch (InterruptedException e) 
     { 
     } 

     // Calculate coarse CPU usage: 
     long time = System.nanoTime(); 
     long threadTime = newBean.getCurrentThreadCpuTime(); 
     double load = (threadTime - lastThreadTime)/(double)(time - lastTime); 
     // Smooth it. 
     smoothLoad += (load - smoothLoad) * 0.1; // damping factor, lower means less responsive, 1 means no smoothing. 
     System.out.println(smoothLoad); 

     // For next iteration. 
     lastTime = time; 
     lastThreadTime = threadTime; 
    } 
0

si está utilizando Linux - sólo tiene que utilizar jconsole - obtendrá toda la pista de java gestión de memoria