C'est le chargeur de classes de fuite de mémoire. Chaque fois que vous redéployer l'application, un nouveau chargeur de classe est créée pour lui et toutes les classes de votre application sont de nouveau chargé. Cela consomme de la mémoire dans la région de perm gen de l'espace.
L'ancien chargeur de classe et tous ses classes chargées, doivent être des ordures collectées, sinon vous allez finir par courir dans une PermGen space OOME après le déploiement de plusieurs fois. Cela ne fonctionne pas si un objet chargé par un chargeur de classe contient une référence à un objet chargé par l'ancien chargeur de classe. Cet article donne une bonne explication de ce problème.
Généralement, chargeur de classe fuites sont difficiles à analyser, et parfois difficiles à corriger.
Pour savoir pourquoi les vieux chargeurs de classes ne sont pas des ordures collectées, vous devez utiliser un profiler. Dans JProfiler, utilisez le segment, sélectionnez la glassfish chargeur de classes d'objets et d'utiliser les entrants références vue de vérifier les chemins d'accès à garbage collector racines.
Le chargeur de classe de classe est appelée org.apache.servlet.jasper.JasperLoader
. Voici une capture d'écran d'une situation régulière, où le chargeur de classe n'est tenue que par vivre les instances des objets chargés.
Dans votre situation, vous devriez voir des références à partir de l'extérieur des objets. Une autre cause fréquente d'un chargeur de classe de fuite dans des conteneurs web est un thread d'arrière-plan qui n'est pas arrêté. Google Guice, par exemple, a un bogue dans la version 3.0.
(Avertissement: mon entreprise se développe JProfiler)