Volcado de hilos de Java – VisualVM, jstack, kill -3, jcmd

El volcado de hilos de Java es una lista de todos los hilos activos en la JVM.

Volcado de Hilos de Java

El volcado de hilos de Java es muy útil para analizar los cuellos de botella en la aplicación y las situaciones de interbloqueo. Aquí aprenderemos múltiples formas a través de las cuales podemos generar un volcado de hilos para un programa de Java. Estas instrucciones son válidas para sistemas operativos *nix pero en Windows los pasos pueden ser un poco diferentes.

  1. Profiler VisualVM: Si estás analizando una aplicación por lentitud, debes usar un profiler. Podemos generar un volcado de hilos para cualquier proceso usando el profiler VisualVM muy fácilmente. Solo necesitas hacer clic derecho en el proceso en ejecución y hacer clic en la opción “Volcado de Hilos” para generarlo.
  2. jstack: Java viene con la herramienta jstack a través de la cual podemos generar un volcado de hilos para un proceso de Java. Este es un proceso de dos pasos.
    1. Averigua el PID del proceso de Java usando el comando ps -eaf | grep java
    2. Ejecuta la herramienta jstack como jstack PID para generar la salida del volcado de hilos en la consola, puedes agregar la salida del volcado de hilos a un archivo usando el comando “jstack PID >> mydumps.tdump
  3. Podemos usar el comando kill -3 PID para generar el volcado de hilos. Esto es ligeramente diferente de otras formas de generar un volcado de hilos. Cuando se emite el comando kill, se genera un volcado de hilos en la salida del sistema del programa. Por lo tanto, si es un programa java con la consola como salida del sistema, el volcado de hilos se imprimirá en la consola. Si el programa java es un servidor Tomcat con la salida del sistema como catalina.out, entonces se generará el volcado de hilos en el archivo.
  4. Java 8 ha introducido la utilidad jcmd. Deberías usar esto en lugar de jstack si estás en Java 8 o superior. El comando para generar un volcado de hilos utilizando jcmd es jcmd PID Thread.print.

Estas son cuatro formas diferentes de generar un volcado de hilos en java. Por lo general, prefiero el comando jstack o jcmd para generar un volcado de hilos y analizarlo. Ten en cuenta que independientemente de la forma que elijas, el volcado de hilos siempre será el mismo.

Ejemplo de volcado de hilos en Java

En mi publicación anterior, expliqué sobre java Timer, aquí hay un volcado de hilos generado para el mismo programa.

2012-12-26 22:28:39
Full thread dump Java HotSpot(TM) 64-Bit Server VM (23.5-b02 mixed mode):

"Attach Listener" daemon prio=5 tid=0x00007fb7d8000000 nid=0x4207 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Timer-0" daemon prio=5 tid=0x00007fb7d4867000 nid=0x5503 waiting on condition [0x00000001604d9000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
	at java.lang.Thread.sleep(Native Method)
	at com.journaldev.threads.MyTimerTask.completeTask(MyTimerTask.java:19)
	at com.journaldev.threads.MyTimerTask.run(MyTimerTask.java:12)
	at java.util.TimerThread.mainLoop(Timer.java:555)
	at java.util.TimerThread.run(Timer.java:505)

"Service Thread" daemon prio=5 tid=0x00007fb7d482c000 nid=0x5303 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=5 tid=0x00007fb7d482b800 nid=0x5203 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=5 tid=0x00007fb7d4829800 nid=0x5103 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=5 tid=0x00007fb7d4828800 nid=0x5003 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=5 tid=0x00007fb7d4812000 nid=0x3f03 in Object.wait() [0x000000015fd26000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x0000000140a25798> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
	- locked <0x0000000140a25798> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
	at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:177)

"Reference Handler" daemon prio=5 tid=0x00007fb7d4811800 nid=0x3e03 in Object.wait() [0x000000015fc23000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x0000000140a25320> (a java.lang.ref.Reference$Lock)
	at java.lang.Object.wait(Object.java:503)
	at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
	- locked <0x0000000140a25320> (a java.lang.ref.Reference$Lock)

"main" prio=5 tid=0x00007fb7d5000800 nid=0x1703 waiting on condition [0x0000000106116000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
	at java.lang.Thread.sleep(Native Method)
	at com.journaldev.threads.MyTimerTask.main(MyTimerTask.java:33)

"VM Thread" prio=5 tid=0x00007fb7d480f000 nid=0x3d03 runnable 

"GC task thread#0 (ParallelGC)" prio=5 tid=0x00007fb7d500d800 nid=0x3503 runnable 

"GC task thread#1 (ParallelGC)" prio=5 tid=0x00007fb7d500e000 nid=0x3603 runnable 

"GC task thread#2 (ParallelGC)" prio=5 tid=0x00007fb7d5800000 nid=0x3703 runnable 

"GC task thread#3 (ParallelGC)" prio=5 tid=0x00007fb7d5801000 nid=0x3803 runnable 

"GC task thread#4 (ParallelGC)" prio=5 tid=0x00007fb7d5801800 nid=0x3903 runnable 

"GC task thread#5 (ParallelGC)" prio=5 tid=0x00007fb7d5802000 nid=0x3a03 runnable 

"GC task thread#6 (ParallelGC)" prio=5 tid=0x00007fb7d5802800 nid=0x3b03 runnable 

"GC task thread#7 (ParallelGC)" prio=5 tid=0x00007fb7d5803800 nid=0x3c03 runnable 

"VM Periodic Task Thread" prio=5 tid=0x00007fb7d481e800 nid=0x5403 waiting on condition 

JNI global references: 116

Un volcado de hilos es la lista de todos los hilos, cada entrada muestra información sobre el hilo que incluye lo siguiente en el orden de aparición.

  1. Nombre del Hilo: Nombre del Hilo
  2. Prioridad del Hilo: Prioridad del hilo
  3. ID del Hilo: Representa el ID único del Hilo
  4. Estado del Hilo: Proporciona el estado actual del hilo, por ejemplo, EJECUTABLE, ESPERANDO, BLOQUEADO. Mientras se analiza el bloqueo, busque los hilos bloqueados y los recursos en los que están intentando adquirir el bloqueo.
  5. Pila de Llamadas del Hilo: Proporciona información vital de la pila para el hilo. Este es el lugar donde podemos ver los bloqueos obtenidos por el Hilo y si está esperando algún bloqueo.

Eso es todo para el volcado de hilos en Java.

Source:
https://www.digitalocean.com/community/tutorials/java-thread-dump-visualvm-jstack-kill-3-jcmd