2017-08-16 4 views
1

Je migre actuellement nos services Web et notre application Web pour utiliser la journalisation Log4j 2.6. Sur la base des informations fournies sur le site Web, l'application Web prend en charge la journalisation partielle sans perte de mémoire et ne prend pas en charge la journalisation complète sans déchets en raison de la possibilité de fuite de mémoire. Quelqu'un peut-il m'aider à comprendre comment la journalisation fonctionne si nous mettons TreadLocal activé dans le premier cas et ThreadLocal désactiver dans le second cas.Pourquoi la consignation log4j gc gratuite ne convient pas à la webapp

En outre, je voudrais savoir dans quels scénarios la journalisation partielle sans déchet est meilleure que la journalisation sans déchets.

Répondre

0

En mode sans déchet, Log4j2 réutilise les objets LogEvent. Pour empêcher plusieurs threads de modifier le même LogEvent en même temps, chaque thread a son propre LogEvent. Ceci est implémenté avec ThreadLocal. ThreadLocals Un point clé de ThreadLocals est que tout ce qui est mis en eux reste là jusqu'à ce qu'il soit explicitement retiré ou que le thread meurt. Même s'il n'y a pas d'autres références à LogEvent, il ne sera pas collecté car le ThreadLocal a toujours une référence, et les threads sont des racines GC.

Les conteneurs d'applications Web chargent souvent une application Web dans un chargeur de classe personnalisé. Cela permet d'arrêter et de recharger différentes versions d'une application Web sans redémarrer le conteneur d'applications Web. Toutefois, si quelque chose a toujours une référence à une classe de la version précédente de l'application Web, cette classe et toutes les classes associées, y compris le chargeur de classes personnalisées, ne peuvent pas être récupérées.

Quand cela pourrait-il se produire? Lorsque le conteneur de l'application Web dispose d'un pool de threads partagé entre les applications Web et non vidé lorsque l'application Web est rechargée. Les threads du pool ont toujours des références ThreadLocal à un objet LogEvent et à une classe de la version précédente de l'application Web. Cette classe ne peut donc pas être récupérée et vous avez une fuite de mémoire.

Conclusion Vous pouvez utiliser l'enregistrement gratuit des ordures dans les applications web si les deux conditions suivantes sont remplies:

  1. Les pools de threads ne sont pas partagées entre les applications Web
  2. Lorsqu'une application Web est rechargée, son pool de threads est également fermé et redémarré

Si les deux réponses ci-dessus sont vraies, je crois que vous pouvez configurer Log4j2 pour utiliser la journalisation sans déchet sans risque fuites de mémoire. Bien sûr, vous devrez faire preuve de diligence raisonnable et tester.