Cómo leer un volcado de hilos JVM

Pega la salida de jstack o de jcmd Thread.print, o abre un archivo .txt o .log, y pulsa Analizar localmente. El volcado se lee en este navegador: el resumen cuenta los hilos por java.lang.Thread.State, la tarjeta inferior ordena los marcos de pila que se repiten y los hallazgos nombran los hilos que esperan un bloqueo que otro hilo mantiene.

Un volcado de 13 hilos y 4,3 KB dio RUNNABLE 4, WAITING 3, BLOCKED 2, TIMED_WAITING 2 y UNKNOWN 2, con java.base/java.lang.Thread.sleep(Native Method) como marco más repetido (3 hilos) y dos hilos HTTP esperando el monitor que tenía cache-writer. No se sube nada y no se guarda copia del volcado.

  1. Pega el volcado en el cuadro o suelta un archivo .txt o .log. Sirven la salida de jstack, de jstack -l y de jcmd <pid> Thread.print; el nombre del archivo permanece junto al cuadro y desaparece en cuanto pegas otro texto.
  2. Pulsa Analizar localmente. El resumen muestra una fila por nombre de estado, la tarjeta inferior lista los doce marcos más frecuentes con su recuento y ambas se rellenan en la misma pasada.
  3. Lee la lista de hallazgos: un interbloqueo de Java se informa una vez y luego se divide en los hilos que se esperan entre sí, y un bloqueo que un hilo espera mientras otro lo mantiene aparece con las dos partes.
  4. Copia el resultado con Copiar o pulsa Descargar para obtener un informe de texto plano con el nombre del archivo cargado (thread-dump-analysis.txt si pegaste el volcado). El informe lleva los recuentos, la tabla de estados, los marcos principales y los hallazgos, no el volcado.
  5. Limpiar vacía el cuadro, las tablas y los hallazgos y devuelve el texto de marcador de posición; después la página no conserva nada.

Qué significan las tablas y los hallazgos

Lo que lee el analizador

Solo se analiza texto, y solo con las formas que escribe un volcado de JVM: cabeceras de hilo (un nombre entre comillas seguido de prio=, tid= o nid=), líneas java.lang.Thread.State, marcos at y las líneas waiting to lock / locked / parking to wait for que añade jstack -l. Los hilos de la VM se imprimen sin línea de estado, así que caen en la fila UNKNOWN: dos de los trece del ejemplo anterior.

El informe de interbloqueo que jstack añade tras la lista de hilos se lee como informe, no como más hilos: un volcado con tres hilos y un interbloqueo sigue siendo tres hilos, y el informe produce un hallazgo más una línea por cada pareja en espera.

Cómo se cuentan los números

Cuenta cada marco de cada hilo, no solo los tres más internos, porque un marco compartido que queda más abajo en la pila es justo lo que dibuja una ruta de llamada repetida. En un ejemplo de 24 hilos cuyo quinto marco es java.base/java.lang.reflect.Method.invoke(Method.java:568), ese marco aparece 18 veces en el volcado y en la tabla.

Una correlación de bloqueo necesita las dos mitades en el mismo volcado: la línea waiting to lock <id> de un hilo y la línea locked <id> de otro. Los bloqueos cuyo dueño no está en el archivo —un volcado truncado o jstack sin -l— se cuentan como esperas, pero no se afirma quién los tiene.

El tamaño no es un límite práctico: un volcado de 240 hilos y 92 KB devolvió 240 hilos, 6 de ellos bloqueados en un mismo monitor y tres marcos contados 240 veces cada uno, porque el trabajo ocurre en esta máquina.

Límites y compatibilidad

Un registro de fallo de HotSpot (hs_err_pid*.log) enumera los hilos Java pero no trae ninguna línea java.lang.Thread.State, así que la página lo dice en lugar de dibujar tablas vacías. Cualquier otro texto sin una sola cabecera de hilo recibe la misma respuesta, y un cuadro vacío obtiene un aviso en vez de un resultado.

Se lee un volcado cada vez. El analizador no se conecta a una JVM, no puede muestrear un proceso en ejecución ni vigilar cambios en un archivo; para una vista en vivo, Flight Recorder o un perfilador son la herramienta adecuada.

Los nombres de estado, las firmas de los marcos y los identificadores de bloqueo se imprimen tal como los escribe el volcado, en inglés, porque son datos; las etiquetas que los rodean siguen el idioma de la página.

Herramientas recientes: