remoto remote para intellij for debug configurar acceso java linux multithreading tomcat h2

java - remote - tomcat debug port default



Tomcat no se detiene. ¿Cómo puedo depurar esto? (7)

Averigüe qué subprocesos siguen ejecutándose (o bloqueados, esperando para ejecutarse) utilizando jstack o enviando una señal al proceso:

kill -3 pid

Cuando sepa esto, puede hacer lo que sea que los enganchó en la notificación de apagado para detener los hilos. O haga que esos hilos deamon hilos.

Consulte esta pregunta de cierre de tomcat para obtener más detalles sobre esto.

Si no sabe dónde se crearon sus hilos, entonces considere agregarles nombres: los ejecutores pueden tomar fábricas de hilos, y puede usar esas fábricas para establecer el estado de deamon de un hilo y también para nombrarlo, de modo que su rastro de pila ser más claro

Tengo un Tomcat 7 ejecutándose en Linux que empiezo por $CATALINA_HOME/bin/startup.sh y se apaga a través de $CATALINA_HOME/bin/shutdown.sh
de /etc/init.d

Todo está bien, excepto 1 problema. A veces Tomcat no se detiene.
Aunque lo detengo y veo en los registros de catalina.out que están bajando, si hago ps -ef todavía puedo ver el proceso en ejecución.

¿Cual podría ser el problema? ¿Cómo puedo depurar esto? Mi sensación es que esto está relacionado con los hilos.

Entonces las partes que son sospechosas son las siguientes:
1) Utilizo LogManager de Log4j para detectar si la configuración de log4j ha sido modificada, pero hago Log4jManager.shutdown en un contextDestroyed ServletContextListener
2) Uso la base de datos H2 y veo en el cierre:

SEVERE: la aplicación web [/ MyApplication] parece haber comenzado una
thread llamado [H2 Log Writer MYAPPLICATION] pero no ha podido detenerlo.
Esto es muy probable que cree una pérdida de memoria

SEVERE: la aplicación web [/ MyApplication] parece haber comenzado una
thread named [H2 File Lock Watchdog
/opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase.lock.db] pero tiene
no pudo detenerlo Esto es muy probable que cree una pérdida de memoria. 2 de abril,
2012 9:08:08 AM org.apache.catalina.loader.WebappClassLoader
clearReferencesThreads SEVERE: la aplicación web [/ MyApplication]
parece haber iniciado un hilo llamado [FileWatchdog] pero ha fallado
para detenerlo Esto es muy probable que cree una pérdida de memoria.

¿Alguna ayuda, por favor? ¿Cómo puedo detectar el problema aquí?

ACTUALIZAR:
Hice un kill -3 según lo sugerido por @daveb, y en el catalina.out veo:

JVMDUMP006I Proceso de volcado de evento "usuario", detalle "" - espere. JVMDUMP032I JVM solicitó el volcado de Java utilizando ''/etc/init.d/javacore.20120402.093922.2568.0001.txt'' en respuesta a un evento JVMDUMP010I Volcado de Java escrito en /etc/init.d/javacore.20120402.093922.2568.0001.txt JVMDUMP013I Evento de volcado procesado "usuario", detalle "".

Hay un javacore en /etc/init.d pero no sé cómo procesarlo. Es decir, ¿qué partes debería investigar?


Compruebe si su aplicación web tiene algún programador activo, como Quartz.

Si no lo detiene, el hilo de la aplicación web nunca terminará hasta que lo mate


En mi caso, tenía un Jage EntityManager deshonesto que no se cerraba correctamente después de su uso. Solucionado eso, y ahora puedo limpiar y construir de nuevo sin matar el maldito proceso de Java cada vez :)


Si está utilizando un Programador u otra entidad en su aplicación web, debe cerrarlo. Por lo general, debe usar ServletContextListener para proporcionar el gancho y realizar su llamada de apagado. Un gancho de cierre no funcionará en este caso porque la JVM no se está cerrando (todavía). Créame, lo he intentado. Si su código está en el código del agente o algo fuera del contenedor / aplicación web, entonces un gancho de apagado DEBERÍA funcionar, aunque a menudo es una experiencia para jalar el cabello para descubrir por qué aún no funciona. Tenga en cuenta que soy calvo.


Si la aplicación web está detenida, todas las conexiones con la base de datos también deberían cerrarse. Si no tiene una lista de conexiones, ejecute la instrucción SQL "shutdown" (esto solo funciona para las bases de datos H2 y HSQLDB).

Si tiene un Servlet registrado, puede hacerlo en el método Servlet.destroy() .

Si ha registrado un ServletContextListener , puede ejecutar la sentencia "shutdown" en el método ServletContextListener.contextDestroyed(ServletContextEvent servletContextEvent) . Esto es lo que hace org.h2.server.web.DbStarter ServletContextListener (el que está incluido en la base de datos H2).


También tuve el mismo problema. Hubo un ThrottledThreadPoolExecutor en mi aplicación que no se cerraba. Cuando lo apago correctamente, Tomcat se detendrá limpiamente. Para resolver el problema, tuve que eliminar todas las aplicaciones de mi directorio webapps tomcat y luego agregarlas una por una y ver cuál causaba el problema.


Tuve exactamente el mismo problema. A veces, el comando ./shutdown.sh no detiene el proceso de tomcat, y su proceso de java permanece en los procesos en ejecución.

Había resuelto este problema usando la versión Tomcat en los repositorios de software de Ubuntu, por:

sudo apt-get install tomcat7

Después de instalarlo desde el administrador de paquetes y configurar algunas configuraciones, no tuve ningún problema para detener / iniciar Tomcat. Usé este comando para parar, y nunca falló:

service tomcat7 stop

que es casi lo mismo que

/etc/init.d/tomcat7 stop

El uso de este comando ejecuta el bloque de código desde el script de inicio, específicamente, los códigos del archivo /etc/init.d/tomcat7 . Así que lo busqué para ver qué hace para matar al proceso de Tomcat con éxito. Aquí está el bloque de código que se ejecuta cuando utiliza el comando de service tomcat7 stop :

log_daemon_msg "Stopping $DESC" "$NAME" set +e if [ -f "$CATALINA_PID" ]; then start-stop-daemon --stop --pidfile "$CATALINA_PID" / --user "$TOMCAT7_USER" / --retry=TERM/20/KILL/5 >/dev/null if [ $? -eq 1 ]; then log_progress_msg "$DESC is not running but pid file exists, cleaning up" elif [ $? -eq 3 ]; then PID="`cat $CATALINA_PID`" log_failure_msg "Failed to stop $NAME (pid $PID)" exit 1 fi rm -f "$CATALINA_PID" rm -rf "$JVM_TMP" else log_progress_msg "(not running)" fi log_end_msg 0 set -e ;;

La parte importante es esta:

start-stop-daemon --stop --pidfile "$CATALINA_PID" / --user "$TOMCAT7_USER" / --retry=TERM/20/KILL/5 >/dev/null

Esto significa "vuelva a intentar detenerse hasta que se detenga el proceso. Aquí está la documentación del comando de revisión del manual de start-stop-daemon :

-R|--retry timeout|schedule With --stop, specifies that start-stop-daemon is to check whether the process(es) do finish. It will check repeatedly whether any matching processes are running, until none are. If the processes do not exit it will then take further action as determined by the schedule. If timeout is specified instead of schedule then the schedule signal/timeout/KILL/timeout is used, where signal is the signal specified with --signal. ...

Entonces, --retry=TERM/20/KILL/5 significa "Envía la señal TERM al proceso, espera 20 segundos, si todavía está funcionando, envía la señal KILL , espera 5 segundos, si todavía está funcionando, hay un problema.

Esto significa que puede configurar el tomcat para ejecutarlo como un demonio y usar un comando como este, o escribir un script para hacer ese tipo de acción para detener tomcat, o simplemente usar Ubuntu y obtener el tomcat del administrador de paquetes.