saber - Monitorear el uso de la CPU por hilo en java?
para un hilo java (6)
Option_1: nivel de código
En su código de lógica de negocios; 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. Entonces regístrelo. 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: nivel de monitor utilizando complementos (cuadro de IBM AIX que no tiene soporte jvisualvm)
Si crees que es un retraso en agregar código ahora, entonces puedes preferir JConsole con soporte para complementos. Seguí this artículo. Descargue el archivo topthreads de ese artículo y ejecute ./jconsole -pluginpath topthreads-1.1.jar
Option_3: supervisa el nivel usando TOP (shift H) + JSTACK (máquina Unix que tiene soporte ''Shif + H'')
Siga this tutorial, donde el comando superior le dará la opción de encontrar el subproceso de CPU superior (nid). Toma ese control que nid en el archivo de salida jstack.
Me gustaría preguntar si hay alguna forma sencilla de determinar el uso de la CPU por subproceso en java. Gracias
Aunque esto depende de la plataforma, creo que lo que estás buscando es ThreadMXBean: java.lang.management.ThreadMXBean . Puede usar el método getThreadUserTime, por ejemplo, para obtener lo que necesita. Para verificar si su plataforma admite la medición de CPU, puede llamar a isThreadCpuTimeSupported ().
Creo que JConsole ( enlace archivado ) proporciona este tipo de información a través de un complemento
Utiliza la función ThreadMXBean getThreadCpuTime ().
Algo en la línea de:
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);
}
}
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 hubo un programa de demostración que hace 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.
Prueba el plugin JConsole "TopThreads". Ver http://lsd.luminis.nl/top-threads-plugin-for-jconsole/
utilizando java.lang.management.ThreadMXBean . Cómo obtener un ThreadMXBean:
ThreadMXBean tmxb = ManagementFactory.getThreadMXBean();
luego puede consultar cuánto consume un hilo específico al usar:
long cpuTime = tmxb.getThreadCpuTime(aThreadID);
Espero eso ayude.