Nous sommes de la création de plusieurs enfants chargeurs de classes à charger dans plusieurs subapplications dans une application Java "conteneur", le prototypage de déploiement à chaud. Lorsque le chemin de classe d'un chargeur de classe a changé (c'est à dire les pots ont été ajoutés, supprimés, mis à jour), l'ancien chargeur de classe est jeté (non référencés) et un nouveau chargeur de classe est créée pour la nouvelle classpath des jarres.
Après la mise à jour du classpath, le déclenchement du déploiement à chaud, nous avons pris un tas de vidage. Le tas de vidage (à l'aide de la Mémoire de l'Analyseur) indique que les vieux chargeurs de classes n'étaient pas des ordures collectées. Certaines classes dans le chargeur de classe parent ont été la mise en cache du vieux chargeurs de classes. Les choses suivantes ont été invoquées pour effacer ces caches:
java.lang.ResourceBundle.clearCache(classLoader);
org.apache.commons.logging.LogFactory.release(classLoader);
java.beans.Introspector.flushCaches();
Même après effacement de la ci-dessus les caches, l'ancien chargeur de classe sont toujours pas nettoyée. Le reste des références pour le chargeur de classe comprenait les éléments suivants:
- les classes chargées par le chargeur de classe
- java.lang.Package créé par le chargeur de classe elle-même
- java.lang.ProtectionDomain créé par le chargeur de classe elle-même
Tous les ci-dessus sont des références circulaires dans le chargeur de classe, ce qui devrait inciter à la collecte des ordures. Je ne suis pas sûr de savoir pourquoi il ne l'est pas. Quelqu'un sait pourquoi les vieux chargeurs de classes ne sont pas encore des ordures collectées, même avec les références circulaires?