2010-10-16 15 views
5

Con JRockit, se puede obtener la lista completa de los hilos de ninguna manera, y todos estos medios incluyen información sobre el Tema (s) Recolección de basura:Con las JVM recientes de Sun (1.6), ¿es posible obtener información de subprocesos de GC?

1) Pedir a la clase Thread de la información:

Thread.getAllStackTraces(); 

2) Utilizando ThreadGroup para obtener esa información:

ThreadGroup root = Thread.currentThread().getThreadGroup(); 
while (root.getParent() != null) { 
    root = root.getParent(); 
} 
Thread[] list = new Thread[root.activeCount() + 5]; 
root.enumerate(list, true); 

3) el uso de JMX para obtener la lista:

ThreadMXBean THREAD_MX_BEAN = ManagementFactory.getThreadMXBean(); 
long[] tids = THREAD_MX_BEAN.getAllThreadIds(); 
ThreadInfo[] tinfos = THREAD_MX_BEAN.getThreadInfo(tids); 

4) CTRL-BREAK

Sin embargo, el uso de la JVM de Sun - al menos reciente de Java 6 versiones - solamente CTRL-BREAK parece que se incluyen los hilos de recolección de basura y el hilo VM periódica de tareas. Me resulta útil para controlar la CPU utilizada por los subprocesos GC para que mi aplicación pueda detectar y registrar cuando GC está usando la mayor parte del tiempo de la CPU. Sin esta información, solo sabrá cuándo GC excede ciertos umbrales establecidos.

Si solo puedo encontrar el ID de subproceso de los subprocesos de GC, entonces JMX probablemente dará el resto de la información que necesito (a menos que haya algo diferente acerca de estos subprocesos). Por ejemplo, usando el método:

long threadId = tids[0]; 
long cpuTime = THREAD_MX_BEAN.getThreadCpuTime(threadId); 

¿Alguien sabe cómo - o si se sabe que no es posible - para obtener información sobre el hilo (s) de recolección de basura utilizando la JVM de Sun?

Respuesta

2

Esto es específico de Java 1.5+ Sun (HotSpot) JVM. Registre el MBean sun.management.HotspotInternal en el MBeanServer que desea supervisar. Esto activará el registro de estos mbeans internos HotSpot:

  • sun.management:type=HotspotClassLoading
  • sun.management:type=HotspotCompilation
  • sun.management:type=HotspotMemory
  • sun.management : type = HotspotRuntime
  • sun.management:type=HotspotThreading

El HotspotThrea ding MBean tiene un atributo llamado InternalThreadCpuTimes que es un mapa de los hilos internos de HotSpot. Los hilos de GC son identificables por su nombre.Por ejemplo, en la JVM estoy corriendo en este momento, se les llama:

  • GC hilo tarea # 1 (ParallelGC)
  • GC hilo tarea # 0 (ParallelGC)

El valor de el mapa es el tiempo de CPU para cada hilo.

El HotSpotMemory MBean también tiene un atributo llamado InternalMemoryCounters que tiene unos pocos bits adicionales de información acerca de GC.

1

Un primer paso es usar verbosegc: java -verbose:gc -XX:+PrintGCDetails, que le dará alguna información sobre el tiempo (reloj de pared) se consume en las operaciones de GC, y el tipo de operación (completa o incremental). Su pregunta parece estar preguntándole si puede obtenerla programáticamente; probablemente pueda obtener información a través de I/F de administración.

Editado para agregar: Parte de esto está disponible a través del MemoryMXBean, pero no los detalles del tiempo del GC. Lo sentimos ...

+0

Sí, pero esto no me ayuda * programáticamente * obtener información acerca de GC Threads. Pero, por supuesto, el resultado detallado al que se refiere puede analizarse después del hecho, seguro. – Eddie

+0

Con JRockit, la lista de subprocesos que puede obtener de varias maneras incluye los subprocesos de GC, y luego puede usar JMX para obtener el tiempo de CPU consumido por cada subproceso de GC. Con Sun JVM, los hilos GC no aparecen incluidos en ninguna lista de hilos. – Eddie

Cuestiones relacionadas