kill -3 para obtener el volcado de hilos de java

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!!

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 

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.

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 

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

 jcmd  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.

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

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 stack 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 syntax 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 syntax JDK: jrcmd [[]] [-l] [-f file] [-p] -h]

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  

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

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

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 progtwig 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