2009-04-16 12 views

Respuesta

17

creo que el JConsole (archived link) proporciona esta clase de información a través de un plugin

JConsole Thread CPU usage, after blogs.oracle.com/lmalventosa/resource/thread_cpu_usage.jpg

Utiliza la función ThreadMXBean getThreadCpuTime().

Algo a lo largo de la línea:

 long upTime = runtimeProxy.getUptime(); 
     List<Long> threadCpuTime = new ArrayList<Long>(); 
     for (int i = 0; i < threadIds.size(); i++) { 
      long threadId = threadIds.get(i); 
      if (threadId != -1) { 
       threadCpuTime.add(threadProxy.getThreadCpuTime(threadId)); 
      } else { 
       threadCpuTime.add(0L); 
      } 
     } 
     int nCPUs = osProxy.getAvailableProcessors(); 
     List<Float> cpuUsageList = new ArrayList<Float>(); 
     if (prevUpTime > 0L && upTime > prevUpTime) { 
      // elapsedTime is in ms 
      long elapsedTime = upTime - prevUpTime; 
      for (int i = 0; i < threadIds.size(); i++) { 
       // elapsedCpu is in ns 
       long elapsedCpu = threadCpuTime.get(i) - prevThreadCpuTime.get(i); 
       // cpuUsage could go higher than 100% because elapsedTime 
       // and elapsedCpu are not fetched simultaneously. Limit to 
       // 99% to avoid Chart showing a scale from 0% to 200%. 
       float cpuUsage = Math.min(99F, elapsedCpu/(elapsedTime * 1000000F * nCPUs)); 
       cpuUsageList.add(cpuUsage); 
      } 
     } 
+1

Solo una nota, es posible que también desee verificar que CpuTime esté habilitado en la JVM que está ejecutando. 'threadBean_.isThreadCpuTimeEnabled()' devolverá el valor booleano y siempre se puede establecer si no está con 'threadBean_.setThreadCpuTimeEnabled (true)' – Graham

11

utilizando java.lang.management.ThreadMXBean. Cómo obtener una ThreadMXBean:

ThreadMXBean tmxb = ManagementFactory.getThreadMXBean(); 

continuación, se puede consultar la cantidad de un hilo específico está consumiendo mediante el uso de:

long cpuTime = tmxb.getThreadCpuTime(aThreadID); 

espero que ayude.

1

De hecho, el objeto ThreadMXBean proporciona la funcionalidad que necesita (sin embargo, es posible que no se implemente en todas las máquinas virtuales).

En JDK 1.5 había un programa de demostración que hacía exactamente lo que necesita. Estaba en la carpeta demo/management y se llamaba JTop.java

Desafortunadamente, no está allí en Java6. Tal vez puedas encontrar en google o descargar JDK5.

3

OPCION_1: Nivel Código

En su código de lógica de negocio; al principio, llame a la API de inicio() y finalmente a la llamada de bloqueo(). De modo que obtendrá tiempo de CPU para ejecutar su lógica por el hilo en ejecución actual. Luego regístrate. Reference.

class CPUTimer 
{ 
    private long _startTime = 0l; 

    public void start() 
    { 
     _startTime = getCpuTimeInMillis(); 
    } 


    public long stop() 
    { 
     long result = (getCpuTimeInMillis() - _startTime); 
     _startTime = 0l; 
     return result; 
    } 

    public boolean isRunning() 
    { 
     return _startTime != 0l; 
    } 

    /** thread CPU time in milliseconds. */ 
    private long getCpuTimeInMillis() 
    { 
     ThreadMXBean bean = ManagementFactory.getThreadMXBean(); 
     return bean.isCurrentThreadCpuTimeSupported() ? bean.getCurrentThreadCpuTime()/1000000: 0L; 
    } 
} 

Option_2: Monitor de nivel de uso de plugins (cuadro de AIX de IBM, que no tienen el apoyo jvisualvm)

Si usted piensa que es el retraso en la adición de código de ahora, entonces usted puede preferir JConsole con complementos compatibles. Seguí el artículo this. Descargar el frasco topthreads de ese artículo y ejecutar ./jconsole -pluginpath topthreads-1.1.jar

option_3: nivel de monitor usando TOP (desplazamiento H) + jstack (máquina Unix que tiene soporte 'SHIFT + H')

Seguir this tutorial, donde el comando superior dará la opción de encontrar el hilo superior de la CPU (nid).Toma ese control que nid en el archivo de salida jstack.

Cuestiones relacionadas