J'ai lu que l'espace Perm gen (ou génération permanente) n'est pas récupéré. Cependant, dans la collection CMS, je peux voir certaines classes se décharger dans mon journal GC. Les déchets perm gen sont-ils donc collectés lors de la collecte complète ou de la collecte CMS?
Réponses
Trop de publicités?Le PermGen garbage collecté comme pour les autres parties du tas.
La chose à noter ici est que la PermGen contient les méta-données des classes et les objets, c'est à dire les pointeurs dans le reste du tas où les objets sont alloués. Le PermGen contient également de la Classe de chargeurs, qui doivent être manuellement détruit à la fin de leur utilisation d'autre qu'ils restent dans la mémoire et aussi garder la tenue des références d'objets sur le tas. La "Présentation de la Génération Permanente" de l'article de Jon Masamitsu sur le Sun / Oracle site de blog peut vous aider.
Dans la génération actuelle de machines virtuelles, permgen est en effet perçues comme d'autres parties du tas. Le visualgc page indique qu'il est collecté avec l'ancienne génération.
Dans les anciennes machines virtuelles ce n'était apparemment pas toujours le cas. Par exemple, en Java 5 le CMS collector , apparemment, n'a pas perçu la permGen par défaut: vous pouvez l'activer avec -XX:+CMSPermGenSweepingEnabled
. J'ai aussi souvenir d'avoir entendu que certains très vieux Jvm ne pas mettre en œuvre permgen collection à tous, bien que je ne trouvez pas une source fiable pour ce ... ermm ... "légende".
L'autre point, c'est que beaucoup de gens ont incorrectement attribué "OutOfMemoryError : permgen" exceptions à la permgen ne sont pas perçus à tous. La réalité est différente. La cause la plus fréquente de ces OOME est une manière insidieuse de stockage de fuite qui se manifeste lorsque vous chaud charger le code en cours d'exécution de la JVM. La fuite se produit parce que lorsqu'une instance de quelques vieux de la classe qui a été remplacée reste accessible. Cela provoque la classe de l'objet pour être utilisable, ce qui provoque les classes du chargeur de classe, afin d'être joignable, ce qui provoque toutes les anciennes classes, afin d'être joignable, en collaboration avec le code de leurs objets, leurs littéraux de chaîne, et leurs images statiques et statique. Beaucoup de ces objets de fuite vivre dans la permgen space.
Mise à JOUR
Comme de Java 8, permgen n'existe plus: PermGen élimination dans le jdk 8