Herramientas para analizar un Java Thread Dump en Linux
Listamos una serie de herramientas para analizar un Java Thread Dump en sistemas GNU/Linux.
¿Qué es un Java Thread Dump?
Si utilizamos el lenguaje de Cervantes, utilizaremos el termino volcado de subprocesos de una aplicación Java.
Un volcado de subprocesos o Thread Dump, es una instantánea del estado de todos los subprocesos de un proceso Java. El estado de cada subproceso se presenta con un seguimiento de pila, que muestra el contenido de una pila de subproceso. Este tipo de volcado es útil para diagnosticar problemas, ya que muestra la actividad de dicho subproceso. Los volcados están sin formato, por lo que podemos guardar su contenido en un archivo y verlos más tarde en un editor de texto o dejar que los procese un programa de terceros.
Para ello nos podemos servir de cantidad de herramientas que tenemos disponibles por los mares de Internet.
1. Utilizar las herramientas JDK
El JDK nos proporciona varias utilidades que pueden capturar el volcado de los subprocesos o Thread Dump de una aplicación Java. Todas estas utilidades se encuentran en la carpeta bin dentro del directorio del JDK y se deben utilizar desde la línea de comandos.
1.1 jstack
Dentro de estas destaca “jstack”. Funciona tomando el pid de un proceso y muestra el volcado de subprocesos en la consola. También se puede redirigir la salida a un archivo.
Su uso:
jstack [-F] [-l] [-m] "pid"
Todos los parámetros son opcionales:
- La opción -F fuerza un volcado de los subprocesos y es útil cuando el proceso no responde.
- La opción -l le indica a la utilidad que busque sincronizadores propios en el “heap” y en los bloqueos.
- La opción -m imprime los frames stack (C y C++) además los marcos de la pila de Java.
Para capturar un volcado de subprocesos y redirigir la información a un fichero:
jstack 8967 |tee /tmp/volcadosubprocesos.txt
Es importante comentar que podemos obtener de forma fácil el pid de un proceso Java usando el comando jps.
1.2 Java Mission Control
Java Mission Control (JMS) es una herramienta GUI que recopila y analiza los datos de aplicaciones Java. Después de que iniciemos JMS, nos muestra una lista de procesos Java que se ejecutan en una máquina local. También puede servirnos para conectarnos a procesos Java remotos.
Una vez dentro la interfaz de la aplicación, podemos hacer click derecho sobre un proceso y pulsar sobre la opción “Start Flight Recording”. A partir de aquí, la pestaña “Subprocesos” nos mostrará los “Thread Dump”
1.3 jvisualvm
Jvisualvm es una herramienta con una interfaz gráfica. Nos permite monitorear, solucionar problemas y perfilar aplicaciones Java. La GUI es simple, bastante intuitiva y fácil de usar.
Una de sus muchas opciones nos permite capturar un thread dump. Si hacemos clic con el botón derecho en un proceso de Java y seleccionamos la opción «Thread Dump«, la herramienta creará un volcado de subprocesos y lo abrirá en una nueva pestaña:
A partir de JDK 9, Visual VM no se incluye en las distribuciones Oracle JDK y Open JDK. Por lo tanto, si usamos Java 9 o versiones más recientes, podemos obtener JVisualVM del sitio del proyecto de código abierto de Visual VM.
1.4 jcmd
jcmd es una herramienta que funciona enviando solicitudes de comando a la JVM. Aunque potente, no contiene ninguna funcionalidad remota; tenemos que usarlo en la misma máquina donde se está ejecutando el proceso de Java.
Uno de sus muchos comandos es Thread.print. Podemos usarlo para obtener un volcado de subprocesos simplemente especificando el pid del proceso:
jcmd 8967 Thread.print
1.5 jconsole
jconsole nos permite inspeccionar el seguimiento de la pila de cada subproceso. Si abrimos jconsole y nos conectamos a un proceso de Java en ejecución, podemos navegar a la pestaña «Threads» y encontrar el seguimiento de la pila de cada subproceso:
2. Herramienta de tereceros
2.1 IBM Thread and Monitor Dump Analyzer for Java (TMDA)
IBM Thread and Monitor Dump Analyzer for Java (TMDA) es una herramienta que permite identificar bloqueos, interbloqueos, contención de recursos y cuellos de botella en volcados de subprocesos de Java.
Su funcionamiento es el siguiente:
java -jar jca*.jar
La forma más sencilla de solicitar un volcado de subprocesos en sistemas basados en POSIX, como GNU/Linux, es enviar la señal kill -3 que pausa de forma no destructiva la JVM, crea el volcado de subprocesos y la JVM continúa (la pausa suele ser de unos pocos cientos de milisegundos). a lo sumo).
kill -3 $PID
Aquí tenéis una captura hecha por mi:
Espero que esta entrada os pueda ser útil en algún momento.
Entradas relacionadas sobre el mismo tema
Instalar Apache Tomcat 8 en Centos 7