Ich möchte fragen, ob es eine einfache Möglichkeit gibt, CPU-Nutzung pro Thread in Java zu ermitteln. DankeÜberwachen CPU-Auslastung pro Thread in Java?
Antwort
Obwohl dies Plattform abhängig ist, glaube ich, was Sie suchen, ist der ThreadMXBean: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/management/ThreadMXBean.html. Sie können beispielsweise die getThreadUserTime-Methode verwenden, um zu erhalten, was Sie benötigen. Um zu überprüfen, ob Ihre Plattform die CPU-Messung unterstützt, können Sie isThreadCpuTimeSupported() aufrufen.
ich glaube, die JConsole (archived link) durch ein Plugin
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);
}
}
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.
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.
Probieren Sie das JConsole-Plugin "TopThreads" aus. Siehe http://lsd.luminis.nl/top-threads-plugin-for-jconsole/
Link über verfault, https://arnhem.luminis.eu/new_version_topthreads_jconsole_plugin/ – Joost
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.
- 1. CPU-Auslastung pro Thread
- 2. Zeitquantum pro Prozess pro Thread
- 3. Ein Thread pro Client. Machbar?
- 4. Starten Sie einen Thread pro Methode in Java
- 5. Eine SQLiteConnection pro Thread?
- 6. Cuda registriert pro Thread
- 7. Pro Thread Speicherzuweisung
- 8. So überwachen Sie einen wichtigen Worker-Thread
- 9. Java: Überwachen Sie die Übernahme von Locks
- 10. GHC pro Thread GC-Strategie
- 11. Wie Zeitzone pro Thread festlegen?
- 12. Pro-Key-Blockierungskarte in Java
- 13. Überwachen Sie .NET-Threads
- 14. Python 3 gleichzeitige.Futures und pro-Thread-Initialisierung
- 15. Timer in Java Thread
- 16. System.exit in Java Thread
- 17. Sind Thread-IDs pro Prozess oder pro Computer eindeutig?
- 18. Was ist der Unterschied zwischen Thread pro Verbindung vs Thread pro Anfrage?
- 19. Android-Nachrichtenwarteschlange pro Thread oder per Handler
- 20. Unterordner mit einem Java-Überwachungsdienst überwachen
- 21. Wie zu überwachen Remote-Java-Prozess
- 22. Erstellt Tomcat einen Thread pro Benutzer?
- 23. Ein DAO pro Thread oder threadsafe DAO?
- 24. Haskell/GHC pro Thread Speicher kostet
- 25. Überwachen von internen Java-Objekten und Speichernutzung
- 26. Unix Pthreads und Signale: pro Thread Signalhandler
- 27. Thread-Zuweisung pro CPU-Kerne (nur Windows)
- 28. Java Authenticator pro Verbindung?
- 29. OS X Java maximale Threads pro Prozess
- 30. Thread-Sicherheit in Java-Klasse
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