2012-07-10 28 views
8

Tengo el siguiente problema:
Despliego una aplicación web en Tomcat (Linux) y después de cerrar Tomcat, si hago ps -ef todavía puedo ver el proceso java ejecutándose.
Creo que esto sucede debido a algún hilo colgante, pero no sé cómo puedo rastrear este hilo.
¿Cómo puedo solucionar este problema?¿Cómo puedo depurar un hilo Java colgante?

Respuesta

5

Puede generar 4-5 volcados de hilo como se describe a continuación y luego analizarlos utilizando herramientas como Samurai.

Lo que quiere comprobar es cuando ocurre un hilo atascado o una transacción de larga ejecución, todos los volcados de hilo mostrarán que cierta identificación de subproceso está en la misma línea en su rastro de pila de Java. En términos más simples, la transacción abarca varios volcados de hilo y, por lo tanto, necesita más investigación.

Ahora, cuando los ejecuta a través de Samurai, los resaltará en color rojo para que pueda hacer clic rápidamente en él y llegar a las líneas que muestran problemas.

Vea un ejemplo de este here. Mire la imagen de salida de Samurai en ese enlace. Las células verdes están bien. Las celdas rojas y grises necesitan mirar.

Generación de un volcado del hilo:

(Linux)

Si la JVM se ejecuta en una consola a continuación, sólo tiene que pulsar Ctrl-\. Si la JVM se ejecuta en segundo plano después enviarlo a la señal QUIT:

kill -QUIT process_id

Hay id_proceso es el número de proceso del proceso de Java que se ejecuta. El volcado de hilo se enviará a donde se redirija la salida estándar. general, usted puede obtener los números de proceso de todos los procesos Java que se ejecutan con el comando:

ps axf | grep java

+0

no es que Jim está pidiendo, Él está pidiendo para depurar approch –

+0

@ user1348753, ver edit. – aviad

+0

@aviad: Hice un 'kill -3' y cargué el javacore a Samurai. No había una tabla visual solo un informe de registro t.¿Cómo puedo rastrear el hilo de este informe? – Jim

2

Usted dice que todavía existe el proceso de java, ¿verdad? Existen procesos siempre que tengan hilos adjuntos, ¿verdad? Si es así, me gustaría ir a por el siguiente enfoque: - ejecutar el proceso con el servidor MBean adjunto y gestionada internamente por la JVM

se conectará con el proceso después de enviar la señal de dejar de fumar y obtener el volcado de hilo (hay debe ser un JMX para eso. Ver el cual las discusiones mirada sospechosa en su caso.

Creo que también se puede utilizar para tomar jvisualvm hilo vertederos ...

+0

No sé cómo hacer los enfoques que recomienda – Jim

+0

Esto se ve aún más fácil, pero era ya sugerido por aviad :): http://www.crazysquirrel.com/computing/java/basics/java-thread-dump.jspx –

+0

En cuanto al enfoque JVisualVM, aquí hay un tutorial http://docs.oracle.com /javase/6/docs/technotes/guides/visualvm/threads.html. Básicamente jvisualvm es solo un archivo ejecutable que se puede encontrar en la carpeta $ JAVA_HOME/bin ... ejecútelo, conéctese a su aplicación y vea qué puede hacer con él. Algo bastante poderoso, realmente :) –