Que signifie réellement PermGen?

122

Je sais ce qu'est PermGen, à quoi il sert, pourquoi il échoue, comment l'augmenter, etc.

Ce que je ne sais pas, c'est ce que signifie PermGen. Permanent ... Gén ... quelque chose?

Est-ce que quelqu'un sait ce que signifie PermGen?

SCdF
la source
1
[Bonne description] [1] du type qui en sait beaucoup sur les composants internes de GC. Au fait, il y a beaucoup d'informations utiles liées au GC dans son blog. [1]: blogs.oracle.com/jonthecollector/entry/…
Ivan Doubrov

Réponses:

84

Génération permanente. Les détails sont bien sûr spécifiques à la mise en œuvre.

En bref, il contient les objets Java associés aux classes et aux chaînes internes. Dans l'implémentation client de Sun avec partage activé, la classes.jsamémoire est mappée pour former les données initiales, avec environ la moitié en lecture seule et la moitié en copie sur écriture.

Les objets Java qui sont simplement anciens sont conservés dans la génération titulaire.

Tom Hawtin - ligne de pêche
la source
19
"Dans JDK 7, les chaînes internées ne sont plus allouées dans la génération permanente du tas Java": oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
almalkawi
30
Et dans JDK 8, il n'y a pas du tout de génération permanente! C'est amusant de voir cette réponse évoluer au fil des ans.
Brian Gordon
3
@BrianGordon est correct .. Pour plus d'informations à ce sujet: stackoverflow.com/a/22509753/4557537
Fadi
59

PermGen est utilisé par la JVM pour contenir les classes chargées. Vous pouvez l'augmenter en utilisant:

-XX:MaxPermSize=384m

si vous utilisez Sun JVM ou OpenJDK.

Donc, si vous obtenez une OutOfMemoryException: PermGen, vous devez soit agrandir PermGen, soit vous pourriez avoir des problèmes de chargeur de classe.

bajafresh4life
la source
6
Quelle était la réponse acceptée au moment où vous avez publié ce commentaire? La réponse actuellement acceptée ( celle-ci , par "Tom Hawtin - tackline") me semble exacte. Cela peut-il être judicieux de modifier votre commentaire afin que les gens ne se méfient pas de la réponse actuellement acceptée?
jbyler
8

Pas vraiment lié à la question d'origine, mais peut-être que quelqu'un la trouvera utile. PermGen est en effet une zone en mémoire où Java conservait ses classes. Donc, beaucoup d'entre nous sont tombés sur OOM dans PermGen, s'il y avait, par exemple, beaucoup de cours.

Depuis Java 8, la zone PermGen a été remplacée par la zone MetaSpace, qui est plus efficace et illimitée par défaut (ou plus précisément - limitée par la quantité de mémoire native, en fonction de la disponibilité de la mémoire virtuelle 32 ou 64 bits jvm et du système d'exploitation). Cependant, il est possible de l'ajuster de certaines manières, en spécifiant par exemple une limite maximale pour la zone. Vous pouvez trouver des informations plus utiles dans cet article de blog .

Alex K.
la source
3

Si je me souviens bien, le gen signifie génération, comme dans un garbage collector générationnel (qui traite les objets plus jeunes différemment des objets de la quarantaine et des objets «permanents»). Le principe de localité suggère que les objets récemment créés seront d'abord effacés.

Uri
la source
1

Permgen est synonyme de génération permanente. C'est l'une des zones de mémoire JVM. Il fait partie de Heap avec une taille fixe en utilisant un indicateur appelé MaxPermSize.

Pourquoi le nom «PermGen»?

Ce permgen a été nommé au tout début de Java. Permgen mains conserve toutes les métadonnées des classes chargées. Mais le problème est qu'une fois qu'une classe est chargée, elle restera dans la JVM jusqu'à l'arrêt de la JVM. Le nom permgen est donc opter pour cela. Mais plus tard, le chargement dynamique des classes est entré en scène mais le nom n'a pas été changé. Mais avec Java 8 , ils ont également résolu ce problème. Désormais, permagen a été renommé MetaSpace avec une taille de mémoire dynamique.

Sumanth Varada
la source