Ce chargeur de classe est fuite de mémoire. Chaque fois que vous redéployez l'application, un nouveau chargeur de classe est créé et toutes les classes de votre application sont à nouveau chargées. Cela consomme de la mémoire dans l'espace perm gén.
L'ancien classloader et toutes ses classes chargées doivent être collectés, sinon vous finirez par exécuter un espace OOME de PermGen après plusieurs déploiements. Cela ne fonctionne pas si un objet chargé par un chargeur de classe externe contient une référence à un objet chargé par l'ancien chargeur de classe. This article donne une bonne explication du problème.
Généralement, les fuites de classloader sont difficiles à analyser et parfois difficiles à réparer. Pour savoir pourquoi les anciens classloaders ne sont pas collectés, vous devez utiliser un profileur. Dans JProfiler, utilisez le séparateur de segments, sélectionnez les objets glassload classloader et utilisez la vue des références entrantes pour rechercher les chemins d'accès aux racines du récupérateur de place.
La classe du chargeur de classe est appelée org.apache.servlet.jasper.JasperLoader
. Voici une capture d'écran d'une situation normale, où le chargeur de classe est uniquement détenu par des instances actives d'objets chargés.
Dans votre situation, vous devriez voir les références des objets extérieurs. Une autre cause fréquente d'une fuite de classloader dans les conteneurs Web est un thread d'arrière-plan qui n'est pas arrêté. Google Guice par exemple a un tel bug dans 3.0.
(non-responsabilité: mon entreprise se développe JProfiler)
Est-ce ce que vous recherchez: http://stackoverflow.com/questions/1996088/java-class-permgen-memory-leak-web-applications-generic-solution – Raedwald