termino saber resueltos para hilos fuente ejemplos como codigo java

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.



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.