J'ai une application Web dans Tomcat 7.
Lorsque j'arrête Tomcat, je vois ces avertissements (mais pas toujours)
SEVERE: The web application [/MyApplication] created a ThreadLocal
with key of type
[org.Apache.xml.security.algorithms.MessageDigestAlgorithm$1] (value
[org.Apache.xml.security.algorithms.MessageDigestAlgorithm$1@2e2c2e2c])
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
[com.Sun.xml.bind.v2.ClassFactory$1@25442544]) and a value of type
[Java.util.WeakHashMap] (value [{class
com.classes.internal.ContactType=Java.lang.ref.WeakReference@17eb17eb,
class
javax.xml.bind.annotation.adapters.HexBinaryAdapter=Java.lang.ref.WeakReference@178a178a,
class
com.classes.internal.xjc.ListType=Java.lang.ref.WeakReference@181c181c,
class
com.classes.internal.xjc.MessageType=Java.lang.ref.WeakReference@17711771,
class
com.classes.internal.xjc.MessageType=Java.lang.ref.WeakReference@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
[org.Apache.xml.security.utils.UnsyncBufferedOutputStream$1@4a904a90])
and a value of type [byte[]] (value [[B@67486748]) 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.
Que signifient ces avertissements dans catalina.out à l'arrêt?
Je vois certaines de mes classes JAXB mentionnées, mais je ne peux pas dire quel est le problème ici.
Vous avez besoin d'aide?
Vous avez une ou plusieurs fuites de mémoire dans votre application. Pour une explication complète des raisons de ces incidents, lesquels sont de votre faute et ce que vous pouvez faire pour les corriger, consultez cette présentation: http://people.Apache.org/~markt/presentations/2010-11-04 -Memory-Leaks-60mins.pdf
En un mot, certains ThreadLocals n'ont pas été nettoyés correctement. La plupart (sinon la totalité) des serveurs J2EE/conteneurs d'applications utilisent des pools de threads pour les demandes entrantes et d'autres tâches, afin d'éviter la surcharge de démarrage de nouveaux threads à tout moment. Le problème est que certaines bibliothèques (et vous-même, si vous ne savez pas mieux) ne nettoient pas leurs ThreadLocals après la fin de l'exécution de la tâche/demande.
Normalement, comme le thread meurt à la fin de l'exécution, les objets stockés dans ThreadLocals ne sont plus référencés et le garbage collector se charge de supprimer ces objets:
Chaque thread contient une référence implicite à sa copie d'une variable locale de thread tant que le thread est vivant et que l'instance de ThreadLocal est accessible; une fois qu'un thread disparaît, toutes ses copies des instances de thread local sont soumises à la récupération de place (sauf s'il existe d'autres références à ces copies).
Mais lorsque le thread a été récupéré à partir d'un pool de threads, il ne meurt pas, mais est à la place retourné au pool. Étant donné que le thread est toujours actif, les ThreadLocals référencés le sont également. Cela se manifeste à la fois comme des fuites de mémoire et des "fuites" de valeurs d'une demande à l'autre lorsque le même ThreadLocal est utilisé et que le thread gérant la demande/tâche a été utilisé auparavant.
Au moins l'un des messages JAXB semble être lié à un bogue connu:
org.Apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks SEVERE: l'application Web [/ MyApplication] a créé un ThreadLocal avec une clé de type [com.Sun.xml.bind.v2.ClassFactory $ 1] (valeur [com.Sun.xml.bind .v2.ClassFactory $ 1 @ 25442544]) et une valeur de type [Java.util.WeakHashMap]
Voir JAXB-56 et JAXB-831 (NB - Ceux-ci sont sur Java.net et nécessitent une connexion pour une visualisation uniforme). Le premier bogue aurait été corrigé mais comme d'autres l'ont commenté, il n'est pas entièrement corrigé. Le deuxième bogue propose une solution de contournement qui consiste à forcer un gc () avant de laisser l'arrêt du contexte qui atténue le problème (mais ne l'élimine pas complètement) - vous pouvez utiliser un ServletContextListener
personnalisé et simplement appeler la fonction System.gc()
dans la méthode contextDestroyed()
.
En ce qui concerne les autres erreurs, vous devez suivre les autres conseils de réponses et effectuer un débogage sérieux.