thread full java multithreading dump

java - full - thread dump analyzer



kill-3 para obtener el volcado de hilos de java (9)

  1. Encuentre la identificación del proceso [ID del PS]
  2. Ejecute jcmd [PS ID] Thread.print

Estoy usando el comando kill -3 para ver el volcado de subprocesos de la JVM en Unix. Pero, ¿dónde puedo encontrar la salida de este comando de kill ? ¡¡Estoy perdido!!


Al usar kill -3 uno debería ver el volcado de hilo en la salida estándar. La mayoría de los servidores de aplicaciones escriben el resultado estándar en un archivo separado. Deberías encontrarlo allí cuando uses kill -3. Hay varias formas de obtener volcados de hilo:

  • Kill -3: Da salida a salida estándar.
  • Si se tiene acceso a la ventana de la consola donde se está ejecutando el servidor, se puede usar la combinación de teclas Ctrl + Break para generar el seguimiento de la pila en la salida estándar.
  • Para VM de hotspot también podemos usar el comando jstack para generar un volcado de hilo. Es una parte del JDK. La sintaxis es la siguiente: Uso: jstack [-l] (para conectarse al proceso en ejecución) jstack -F [-m] [-l] (para conectarse a un proceso bloqueado)
  • Para JRockit JVM podemos usar el comando JRCMD que viene con la sintaxis JDK: jrcmd [[]] [-l] [-f file] [-p] -h]

Alternativamente, puede usar jstack (Incluido con JDK) para tomar un volcado de hilo y escribir el resultado donde desee. ¿Eso no está disponible en un entorno Unix?

jstack PID > outfile


Con Java 8 en imagen, jcmd es el enfoque preferido.

jcmd <PID> Thread.print

A continuación se muestra el fragmento de la documentación de Oracle :

El lanzamiento de JDK 8 introdujo Java Mission Control, Java Flight Recorder y la utilidad jcmd para diagnosticar problemas con aplicaciones JVM y Java. Se sugiere utilizar la última utilidad, jcmd en lugar de la utilidad jstack anterior para diagnósticos mejorados y una sobrecarga de rendimiento reducida.

Sin embargo, enviar esto con la aplicación puede implicar una licencia que no estoy seguro.


El volcado de subprocesos se escribe en el sistema fuera de la VM en la que ejecutó kill -3. Si está redirigiendo la salida de la consola de la JVM a un archivo, el volcado de la cadena estará en ese archivo. Si la JVM se está ejecutando en una consola abierta, entonces el volcado de la cadena se mostrará en su consola.


En Jboss puedes realizar lo siguiente

nohup $JBOSS_HOME/bin/run.sh -c yourinstancename $JBOSS_OPTS >> console-$(date +%Y%m%d).out 2>&1 < /dev/null & kill -3 <java_pid>

Esto redirigirá su salida / subproceso a la consola de archivos especificada en el comando anterior.


En el mismo lugar donde se coloca el stdout de JVM. Si tiene un servidor Tomcat, este será el archivo catalina_(date).out .


Hay una forma de redireccionar la salida de volcado de hilo JVM en la señal de corte para separar el archivo con la opción de diagnóstico LogVMOutput :

-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log


Pasos que debe seguir si quiere el volcado de subprocesos de su proceso StandAlone Java

Paso 1: Obtenga la identificación del proceso para el script de shell que llama al programa java

linux$ ps -aef | grep "runABCD" user1 **8535** 4369 0 Mar 25 ? 0:00 /bin/csh /home/user1/runABCD.sh user1 17796 17372 0 08:15:41 pts/49 0:00 grep runABCD

Paso 2: Obtenga la identificación del proceso para el niño que fue invocada por el runABCD. Use el PID anterior para obtener los niños.

linux$ ps -aef | grep **8535** user1 **8536** 8535 0 Mar 25 ? 126:38 /apps/java/jdk/sun4/SunOS5/1.6.0_16/bin/java -cp /home/user1/XYZServer user1 8535 4369 0 Mar 25 ? 0:00 /bin/csh /home/user1/runABCD.sh user1 17977 17372 0 08:15:49 pts/49 0:00 grep 8535

Paso 3: Obtenga el JSTACK para el proceso particular. Obtenga la identificación del proceso de su proceso XYSServer. es decir, 8536

linux$ jstack **8536** > threadDump.log