java - Tomcat muere de repente
crash jvm (4)
Lo siento, tuve que quitar el cheque verde de @erickson. Finalmente me di cuenta de lo que estaba matando a Tomcat.
Parece que un complemento de perfilador no está configurado correctamente con VisualVM y el intento de ejecutar un perfil en el proceso de Tomcat lo mató.
Investigar por qué ahora mismo, y actualizaré esta respuesta una vez que sepa más.
Intentando diagnosticar algunos errores de Tomcat ( 7.0.21
) y / o JVM extraños en una máquina de Linux de 64 bits (CentOS).
Estoy probando la carga de nuestra aplicación de servidor e intenté golpearla con mensajes de 100K. jvisualvm
y mantuve mis ojos en el montón todo el tiempo. Todo se veía genial * (ver más abajo) hasta que llegué a aproximadamente 93K de mensajes procesados y luego Tomcat murió. Ingresó un ps
en el número PID de Tomcat para confirmar que estaba muerto.
Hasta este choque:
- La prueba de carga había estado funcionando durante unos 90 minutos; Debería haber terminado poco después ya que estábamos en 93K / 100K)
- CPU se mantuvo fuerte alrededor del 45%
- El montón usado fue de alrededor de 2 GB (más o menos un montón después de GC), pero el tamaño del montón aumentó de 4 GB a
MAX_HEAP
después de unos 30 minutos - La carga / descarga de la clase estaba completando un ciclo normalmente
- Los vertederos eran normales.
En ninguna parte del código del servidor hay llamadas a System.exit()
, por lo que podemos descartarlo (y sí, lo he comprobado dos veces).
No estoy seguro de si esto es un fallo de Tomcat o la JVM ( ¿cómo puedo saberlo? ). E incluso si lo supiera, parece que no puedo encontrar ninguna indicación de lo que salió mal:
- Todos los registros de la aplicación del servidor se detienen sin ningún mensaje de ERROR (aunque tenemos el registro configurado universalmente en DEBUG y superior)
- Los archivos de
catalina.out
y respeto de Tomcatlocalhost_access_*
detienen sin ninguna información
He oído que es posible hacer que Tomcat registre un volcado de información cuando lo hace, pero no estoy seguro de cómo hacerlo y los ejemplos en línea no ayudan mucho.
¿Cómo haría SO para diagnosticar esto? ¿Qué pasos debo tomar para comenzar a descartar todos los factores posibles?
¡Gracias por adelantado!
Otra posibilidad es que el sistema operativo se esté quedando sin memoria y el OOM Killer esté matando su proceso. En este caso, la JVM no tendría la oportunidad de escribir un volcado de pila o un archivo hs_err_pid.
Puede usar la opción java -XX: + HeapDumpOnOutOfMemoryError para crear un volcado de pila para el bloqueo de jvm debido a un error de memoria insuficiente.
Más detalles aquí Utilizando el parámetro HeapDumpOnOutOfMemoryError para el volcado de pila para JBoss .
Si la JVM se bloquea, debería tener un archivo hs_err_pidNNN.log; No tienes que hacer nada para habilitar esto. Su ubicación depende de su sistema operativo y de cómo esté ejecutando Tomcat. En Windows, pueden aparecer en su escritorio, a menos que se esté ejecutando como un servicio. De lo contrario, deberían estar en el directorio de trabajo actual del proceso bloqueado.
Su sistema operativo probablemente proporciona herramientas adicionales para el monitoreo de procesos; podría describir su entorno más, o tal vez preguntar en serverfault.com .
También es posible que jvisualvm
esté causando la caída.
Intentaría reproducir el problema y simplificar progresivamente el escenario para ayudar a aislar la causa.