2011-02-02 32 views
85

Estoy usando el comando kill -3 para ver el volcado de hebras de la JVM en Unix. Pero, ¿dónde puedo encontrar el resultado de este comando kill? ¡¡Estoy perdido!!kill -3 para obtener el volcado del hilo java

+0

¿Qué proceso estás matando? ¿Es un servidor de aplicaciones J2EE? Si es el caso, debe encontrar el rastro de pila en la salida estándar. –

+0

Estoy matando a un proceso que ejecuta la clase Java – javanerd

+1

No debe escribir el volcado de subprocesos en la consola. ya que la clase Java tiene una consola como estándar – javanerd

Respuesta

158

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

jstack PID > outfile 
+0

Gracias por eso. ¡Absolutamente! Sí, puedo usar esto jstack PID> archivo de salida generará el volcado de hilo en ese período de tiempo particular. ¿No es así? – javanerd

+1

Sí, en el momento en que se ejecuta. También puede especificar -l (L minúscula) para una lista larga que imprime información de bloqueo adicional –

+2

Hasta que el comando jstack falle consistentemente debido a "No se puede deducir el tipo de hilo de la dirección" ;-( – noahlz

6

En el mismo lugar donde se coloca la extensión estándar de la JVM. Si tiene un servidor Tomcat, este será el archivo catalina_(date).out.

30

El volcado de hilo se escribe en el sistema fuera de la máquina virtual 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.

+1

Hay una forma de redirigir la salida de volcado de subprocesos de JVM a un archivo separado. Ver en mi respuesta. – Vadzim

26

No es una forma de redirigir JVM salida de volcado de hilo en señal de interrupción al archivo separado con LogVMOutput diagnostic option:

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

Técnicamente, esto no "redirige" la salida de volcado de hilo. Activa el registro de JVM en jvm.log (que incluye salida de volcado de hilo) pero kill -QUIT seguirá volcando al stdout (aswell) del proceso. Subida de la descripción de las opciones de JVM oscuras :) – sqweek

2

En Jboss se pueden realizar las siguientes

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/threadump a la consola de archivos especificada en el comando anterior.

7

Al usar kill -3 se 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 maneras de obtener volcados de hilo:

  • Kill -3: Da salida a la 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 hotspot VM también podemos usar el comando jstack para generar un volcado de hilo. Es una parte del JDK. Sintaxis es la siguiente: Uso: jstack [-l] (para conectarse a un proceso en ejecución) jstack -F [-m] [-l] (para conectarse a un proceso bloqueado)
  • Para JRockit JVM podemos utilizar jRCMD de comandos que viene con el JDK sintaxis: jrcmd [[]] [-l] [-f archivo] [-p] -h]
2
  1. encontrar el ID del proceso [PS ID]
  2. Ejecutar jcmd [PS ID] Thread.print
17

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

jcmd <PID> Thread.print 

siguiente es el fragmento de Oracle documentation:

La liberación de JDK de Java introducido 8 Control de la Misión, Java registradores de vuelo, y la utilidad jcmd para el diagnóstico de problemas con aplicaciones Java JVM y. Se sugiere utilizar la utilidad más reciente, 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.

+0

Desafortunadamente 'jcmd' no se puede conectar al proceso de servicio de Windows con' com.sun.tools.attach.AttachNotSupportedException: memoria insuficiente o privilegios insuficientes para adjuntar' mientras 'jstack -F' tiene éxito: https://stackoverflow.com/questions/1197912/cant-debug-java-windows-services-with-jhat-jps-jstack/47723393#47723393 – Vadzim

1

Los pasos que debe seguir si desea que el vertedero de hilo de su proceso de Java autónomas

Paso 1: Obtener el identificador de proceso para el script de shell llamar 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 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: Obtener el jstack para el proceso particular. Obtenga la identificación del proceso de su proceso XYSServer. es decir 8536

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