2009-04-16 11 views

risposta

17

Credo che il JConsole (archived link) vuol fornire questo tipo di informazioni attraverso un plugin

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

Esso utilizza la funzione ThreadMXBean getThreadCpuTime().

Qualcosa lungo la linea del:

 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, si potrebbe anche voler controllare che CpuTime sia abilitato nella JVM che si sta eseguendo. 'threadBean_.isThreadCpuTimeEnabled()' restituirà il valore booleano e puoi sempre impostarlo se non è con 'threadBean_.setThreadCpuTimeEnabled (true)' – Graham

11

utilizzando java.lang.management.ThreadMXBean. Come ottenere un ThreadMXBean:

ThreadMXBean tmxb = ManagementFactory.getThreadMXBean(); 

allora si può interrogare quanto un thread specifico sta consumando utilizzando:

long cpuTime = tmxb.getThreadCpuTime(aThreadID); 

Speranza che aiuta.

1

Infatti l'oggetto ThreadMXBean fornisce la funzionalità necessaria (tuttavia potrebbe non essere implementata su tutte le macchine virtuali).

In JDK 1.5 c'era un programma dimostrativo che faceva esattamente quello che ti serviva. Era nella cartella demo/gestione e si chiamava JTop.java

Unfortnately, non è lì in Java6. Forse puoi trovarlo su google o scaricare JDK5.

3

option_1: Livello codici

Nel codice logica di business; all'inizio chiama call start() e infine blocca call stop(). In modo da ottenere tempo CPU per l'esecuzione della logica dal thread corrente in esecuzione. Quindi collegalo. 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: livello monitor usando i plugin (scatola di AIX di IBM che non hanno il supporto jvisualvm)

Se si pensa che è in ritardo l'aggiunta di codice ora, allora si può preferire JConsole con supporto per i plugin. Ho seguito l'articolo this. Scarica il vaso topthreads da tale articolo e correre ./jconsole -pluginpath topthreads-1.1.jar

Option_3: livello monitor usando TOP (turno A) + jstack (macchina Unix, che ha il supporto 'Shif + H')

Segui this tutorial, dove il comando top darà l'opzione per trovare il thread della CPU superiore (nid).Prendi quel controllo che si trova nel file di output jstack.

Problemi correlati