En Java, les déchets de la génération permanente sont-ils collectés?

J’ai lu que l’espace de Perm gen (ou la génération permanente) n’est pas collecté. Cependant, dans la collection CMS, je peux voir certaines classes se décharger dans mon journal GC. Les ordures perm gén sont-elles alors collectées lors de la collecte complète ou de la collection CMS?

    Le PermGen est un garbage collecté comme les autres parties du tas.

    La chose à noter ici est que le PermGen contient des métadonnées des classes et des objects, c’est-à-dire des pointeurs dans le rest du tas où les objects sont alloués. Le PermGen contient également des chargeurs de classe qui doivent être détruits manuellement à la fin de leur utilisation, sinon ils restnt en mémoire et conservent également des références à leurs objects sur le tas. L’article de Jon Masamitsu sur le blog Sun / Oracle pourrait vous aider.

    Dans les JVM de la génération actuelle, permgen est en effet collecté comme d’autres parties du tas. La page visualgc indique qu’elle est collectée avec l’ancienne génération.

    Dans les anciennes JVM, ce n’était apparemment pas toujours le cas. Par exemple, dans Java 5, le collecteur du CMS n’a apparemment pas collecté le permGen par défaut: vous pouvez l’activer avec -XX:+CMSPermGenSweepingEnabled . Je me souviens également d’avoir entendu que de très vieilles machines virtuelles Java n’implémentaient pas du tout la collecte de permgen, bien que je ne puisse pas trouver de source fiable pour cela … ermme … “factoid”.

    L’autre point, c’est que beaucoup de personnes ont incorrectement atsortingbué les exceptions “OutOfMemoryError: permgen” à Permgen qui ne sont pas collectées du tout. La réalité est différente. La cause la plus courante de ces problèmes est une fuite de stockage insidieuse qui se manifeste lorsque vous chargez du code à chaud dans une machine virtuelle Java en cours d’exécution. La fuite se produit car lorsqu’une instance d’une ancienne classe remplacée rest accessible. Cela permet d’accéder à la classe de l’object, ce qui entraîne l’atteinte du classloader des classes, ce qui entraîne la possibilité d’accéder à toutes les anciennes classes, avec leurs objects de code, leurs littéraux de chaîne et leurs frameworks statiques. Un grand nombre de ces objects divulgués vivent dans un espace permanent.


    METTRE À JOUR

    A partir de Java 8, le permgen n’existe plus: élimination de PermGen dans JDK 8