2016-10-06 2 views
2

J'utilise log4j2 pour la journalisation, Tomcat8 et java8 version. J'ai utilisé l'attribut "monitorInterval" pour vérifier périodiquement mon fichier log4j2.xml. Lors de l'arrêt de mon tomcat je suis confronté à un problème de fuite de mémoire.Comment résoudre ce problème de fuite de mémoire?Tomcat problème de fuite de mémoire du thread log4j2

Voici les journaux catalina:

06-Oct-2016 15: 13: 55,927 AVERTISSEMENT [localhost-StartStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads L'application web [mywebapp] semble avoir démarré un thread nommé [Log4j2-Log4j2Scheduled-1] mais n'a pas réussi à l'arrêter. Ceci est très susceptible de créer une fuite de mémoire. Empiler trace de fil: sun.misc.Unsafe.park (méthode native) java.util.concurrent.locks.LockSupport.parkNanos (LockSupport.java:215) java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.awaitNanos (AbstractQueuedSynchronizer.java:2078) java.util.concurrent.ScheduledThreadPoolExecutor $ DelayedWorkQueue.take (ScheduledThreadPoolExecutor.java:1093) java.util.concurrent.ScheduledThreadPoolExecutor $ DelayedWorkQueue.take (ScheduledThreadPoolExecutor.java:809) java.util. concurrent.ThreadPoolExecutor.getTask (ThreadPoolExecutor.java:1067) java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1127) java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) java .l ang.Thread.run (Thread.java:745)

Merci d'avance.

Mise à jour: mes journaux J'ai analysé, en fait le contexte enregistreur est initilising encore une fois Log4jServletContextListener est en train de détruire ..

2016-10-22 13: 49: 36347 localhost-StartStop-2 DEBUG Log4jServletContextListener veiller à ce que Log4j s'arrête correctement. 22/10/2016 13: 49: 36382 localhost-StartStop-2 DEBUG À partir LoggerContext [name = bb4719, [email protected]] ...

En fait, Dans mon application, j'utilise Spring ContextLoaderListner dans web.xml, donc il peut utiliser la journalisation en interne tout en détruisant Spring Listner.

Merci

+0

Pouvez-vous coller des propriétés de catalina ou simplement des lignes où il est dit log4j? – bhantol

+0

Vous pouvez suivre https://issues.apache.org/jira/browse/LOG4J2-1259 – bhantol

+0

j'ai regardé dans log4j2-1259, je n'ai pas obtenu sa conclusion correctement. – Reetika

Répondre

4

Cela devrait fonctionner.

Assurez-vous d'inclure log4j-web dans votre build.

Par exemple en tant que dépendance maven.

<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-web</artifactId> 
</dependency> 

Si vous utilisez un conteneur servlet 3.0 ou plus récent (comme dans Tomcat 8) aucune configuration supplémentaire est nécessaire (tant que vous ne l'avez pas omettre Tomcat pour rechercher ServletContainerInitializer dans certains pots). Pour plus d'informations, voir Using Log4j 2 in Web Applications.


MISE À JOUR

J'ai d avec Trie votre mise en place (Tomcat 8.0.38, Log4j-2.6.2) et cela fonctionne. Pour le vérifier si les Log4jServletContextListener et Log4jServletFilter sont initialisés, définissez le niveau StatusLogger sur DEBUG dans votre log4j2.xml. Après cela, vous devriez être en mesure de voir les sorties suivantes dans votre appender root lorsque l'application est déployée.

2016-10-14 20:21:36,762 RMI TCP Connection(2)-127.0.0.1 DEBUG Log4jServletContextListener ensuring that Log4j starts up properly. 
2016-10-14 20:21:36,764 RMI TCP Connection(2)-127.0.0.1 DEBUG Log4jServletFilter initialized. 

Si votre application est redéployée, vous devriez voir les lignes suivantes dans votre journal.

2016-10-14 20:22:00,276 RMI TCP Connection(2)-127.0.0.1 DEBUG Log4jServletFilter destroyed. 
2016-10-14 20:22:00,286 RMI TCP Connection(2)-127.0.0.1 DEBUG Log4jServletContextListener ensuring that Log4j shuts down properly. 

si vous ne voyez pas les journaux. Vous devez vérifier votre catalina.properties si votre jarsToSkip contient des fichiers jars de log4j2 ou si vous avez défini un paramètre isLog4jAutoInitializationDisabled avec la valeur false dans votre fichier web.xml.

<context-param> 
    <param-name>isLog4jAutoInitializationDisabled</param-name> 
    <param-value>false</param-value> 
</context-param> 
+0

@Reetika S'il vous plaît accepter si cela a résolu votre problème. – bhantol

+0

J'utilise le conteneur 3.0 de servlet. Mais toujours confronté à un problème de fuite de mémoire. J'ai également changé catalina.properties comme mentionné dans le document log4j2. – Reetika

+0

@Reetika, dites-nous exactement quelles versions de log4j2 et Tomcat 8 vous utilisez. –