2012-04-03 14 views
13

que tienen una aplicación Web en Tomcat 7.
Cuando apago Tomcat veo éstos advertencia (pero no siempre)¿Qué son estas advertencias en catalina.out?

SEVERE: The web application [/MyApplication] created a ThreadLocal 
with key of type 
[org.apache.xml.security.algorithms.MessageDigestAlgorithm$1] (value 
[[email protected]2e2c]) 
and a value of type [java.util.HashMap] (value 
[{http://www.w3.org/2000/09/xmldsig#sha1=MESSAGE DIGEST SHA-1}]) but 
failed to remove it when the web application was stopped. Threads are 
going to be renewed over time to try and avoid a probable memory leak. 
Apr 3, 2012 1:56:19 PM org.apache.catalina.loader.WebappClassLoader 
checkThreadLocalMapForLeaks SEVERE: The web application 
[/MyApplication] created a ThreadLocal with key of type 
[com.sun.xml.bind.v2.ClassFactory$1] (value 
[[email protected]]) and a value of type 
[java.util.WeakHashMap] (value [{class 
[email protected]b17eb, 
class 
javax.xml.bind.a[email protected]178a178a, 
class 
[email protected]1c181c, 
class 
c[email protected]17711771, 
class 
c[email protected]17011701}]) 
but failed to remove it when the web application was stopped. Threads 
are going to be renewed over time to try and avoid a probable memory 
leak. Apr 3, 2012 1:56:19 PM 
org.apache.catalina.loader.WebappClassLoader 
checkThreadLocalMapForLeaks SEVERE: The web application 
[/MyApplication] created a ThreadLocal with key of type 
[org.apache.xml.security.utils.UnsyncBufferedOutputStream$1] (value 
[[email protected]a90]) 
and a value of type [byte[]] (value [[[email protected]]) but failed to 
remove it when the web application was stopped. Threads are going to 
be renewed over time to try and avoid a probable memory leak. 

¿Qué significan estas advertencias en catalina.out en el apagado?
Veo algunas de mis clases JAXB mencionadas, pero no puedo decir cuál es el problema aquí.

¿Alguna ayuda, por favor?

Respuesta

23

En pocas palabras, algunos ThreadLocals no se han limpiado correctamente. La mayoría (si no todos) los servidores J2EE/Contenedores de aplicaciones utilizan grupos de subprocesos para solicitudes entrantes y otras tareas, para evitar la sobrecarga de iniciar nuevos subprocesos todo el tiempo. El problema es que algunas bibliotecas (y usted mismo, si no lo sabe) no limpian sus ThreadLocals después de que finaliza la ejecución de la tarea/solicitud.

Normalmente, como el hilo muere en final de la ejecución, los objetos almacenados en ThreadLocals ya que se hace referencia no son y el recolector de basura se ocupa de la eliminación de tales objetos:

Cada hilo tiene una referencia implícita a su copia de una variable local del subproceso, siempre que el subproceso esté activo y se pueda acceder a la instancia ThreadLocal ; después de que un hilo desaparece, todas las copias de instancias locales de subprocesos están sujetas a la recolección de elementos no utilizados (a menos que existan otras referencias a estas copias).

Pero cuando el hilo ha sido obtenido de un grupo de subprocesos, no se muere, sino que se devuelve al grupo. Como el hilo todavía está vivo, también lo son los ThreadLocals a los que se hace referencia. Esto se manifiesta como pérdidas de memoria y "pérdida" de valores de una solicitud a otra cuando se usa el mismo ThreadLocal y el hilo que maneja la solicitud/tarea se utilizó antes.

+0

+ 1.No uso locas de hilo en mi código. ¿Cómo puedo buscar más en esto? – Jim

+1

@Jim Vea aquí para la supervisión: http://tomcat.apache.org/tomcat-7.0-doc/monitoring.html, después de habilitar el JMX-remote, puede usar, por ejemplo, JConsole (viene con JDK) para acceder a él. Las ThreadLocals son probablemente de alguna biblioteca que estás usando. Como supongo, dado que estas advertencias no siempre aparecen, es posible que alguna biblioteca estuviera haciendo algo cuando cerró la aplicación, por lo que Tomcat * podría * dar falsos positivos. Si el uso de memoria de la aplicación no crece con el tiempo cuando se usa durante períodos más largos y no se redesplega con frecuencia, no me preocuparía tanto. – esaj

10

Al menos uno de los mensajes JAXB parece estar relacionado con un fallo conocido:

org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks GRAVES: La aplicación web [/ MyApplication] creó un ThreadLocal con clave de tipo [com.sun.xml.bind.v2.ClassFactory $ 1] (valor [[email protected]]) y un valor de tipo [java.util.WeakHashMap ]

Consulte JAXB-563 y JAXB-831 (NB: están en java.net y requieren un inicio de sesión para verlos de manera uniforme). El primer error fue supuestamente reparado, pero como otros han comentado, esto no está completamente solucionado. El segundo error tiene una solución sugerida que es forzar un gc() antes de permitir el apagado del contexto que mitiga el problema (aunque no lo elimine por completo): puede usar un ServletContextListener personalizado y simplemente llamar al System.gc() en el método contextDestroyed().

En cuanto a los otros errores, debe seguir los consejos de las otras respuestas y realizar algunas depuraciones graves.

+0

Hombre, este parece ser mi problema, pero no puedo iniciar la aplicación en Tomcat porque me sigue dando este error. Ya cambié el web.xml con el nuevo ServletContextListener. ¿Alguna sugerencia? –

+2

Me tocó este problema al ejecutar Jersey en Tomcat, con los controladores Datastax Cassandra. Aunque cerré la conexión del clúster de Cassandra en contexto Destruido() Todavía estaba obteniendo los errores de pérdida de memoria/subprocesos cada vez que volví a desplegar la aplicación. Al agregar System.gc() después de cluster.close() se resolvió el problema. –

Cuestiones relacionadas