2009-04-16 7 views

Antwort

17

ich glaube, die JConsole (archived link) durch ein Plugin

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

Es verwendet ThreadMXBean getThreadCpuTime() Funktion, um diese Art von Informationen bietet.

Etwas entlang der Linie:

 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

Nur eine Anmerkung, möchten Sie vielleicht auch überprüfen, dass CpuTime in der JVM aktiviert ist, die Sie ausführen. ‚ThreadBean_.isThreadCpuTimeEnabled()‘ wird boolean Wert zurückgeben und Sie können es immer dann gesetzt, wenn es nicht mit ‚threadBean_.setThreadCpuTimeEnabled (true)‘ ist – Graham

11

von java.lang.management.ThreadMXBean verwenden. Wie ein ThreadMXBean zu erhalten:

ThreadMXBean tmxb = ManagementFactory.getThreadMXBean(); 

dann können Sie abfragen, wie viel ein bestimmter Thread verbraucht durch den Einsatz:

long cpuTime = tmxb.getThreadCpuTime(aThreadID); 

Hoffe, es hilft.

1

Tatsächlich bietet das Objekt ThreadMXBean die Funktionalität, die Sie benötigen (es ist jedoch möglicherweise nicht auf allen virtuellen Maschinen implementiert).

In JDK 1.5 gab es ein Demo-Programm, das genau das tat, was Sie brauchen. Es war im Ordner demo/management und hieß JTop.java

Leider ist es nicht in Java6. Vielleicht können Sie bei Google finden oder JDK5 herunterladen.

3

option_1: Code Ebene

In Ihrem Business-Logik-Code; am Anfang Aufruf start() API und im Block schließlich Anruf stop(). Damit erhalten Sie CPU-Zeit für die Ausführung Ihrer Logik durch den aktuell laufenden Thread. Dann log dich ein. 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-Ebene unter Verwendung von Plug-ins (AIX IBM-Box, die nicht über jvisualvm Unterstützung)

Wenn Sie denken, es Verzögerung ist jetzt Code in das Hinzufügen, dann können Sie es vorziehen, mit JConsole Plugins unterstützen. Ich folgte this Artikel. Laden Sie die topthreads jar aus diesem Artikel und laufen ./jconsole -pluginpath topthreads-1.1.jar

Option_3: Monitor Ebene mit TOP (Verschiebung H) + jstack (Unix-Maschine, die 'Shif + H' Unterstützung hat)

Follow this Tutorial, Der Befehl top gibt die Möglichkeit, den oberen CPU-Thread (nid) zu finden.Nimm das nid in der JStack-Ausgabedatei.