Quelle est la différence entre PermGen et Metaspace?


118

Jusqu'à Java 7, il y avait une zone dans la mémoire JVM appelée PermGen , où JVM conservait ses classes. Dans Java 8, il a été supprimé et remplacé par la zone appelée Metaspace .

Quelles sont les différences les plus importantes entre PermGen et Metaspace?

La seule différence que je connais est qu'elle java.lang.OutOfMemoryError: PermGen spacene peut plus être lancée et que le paramètre VM MaxPermSizeest ignoré.



@ the8472 Oui, mais ces résultats (et bien d'autres) Google ne décrivent que le mécanisme Metaspace, sans rien mentionner sur les différences exactes entre celui-ci et PermGen.
Kao

Réponses:


137

La principale différence du point de vue de l'utilisateur - que je pense que la réponse précédente ne souligne pas assez - est que Metaspace par défaut augmente automatiquement sa taille (jusqu'à ce que le système d'exploitation sous-jacent fournit), tandis que PermGen a toujours une taille maximale fixe. Vous pouvez définir un maximum fixe pour Metaspace avec des paramètres JVM, mais vous ne pouvez pas augmenter automatiquement PermGen.

Dans une large mesure, il s'agit simplement d'un changement de nom. À l'époque de l'introduction de PermGen, il n'y avait pas de chargement (dé) Java EE ou de classe dynamique, donc une fois qu'une classe était chargée, elle était bloquée en mémoire jusqu'à l'arrêt de la JVM - donc la génération permanente . De nos jours, les classes peuvent être chargées et déchargées pendant la durée de vie de la JVM, donc Metaspace a plus de sens pour la zone où les métadonnées sont conservées.

Les deux contiennent les java.lang.Classinstances et les deux souffrent de fuites de ClassLoader . La seule différence est qu'avec les paramètres par défaut de Metaspace, cela prend plus de temps jusqu'à ce que vous remarquiez les symptômes (car il augmente automatiquement autant que possible), c'est-à-dire que vous éloignez simplement le problème sans le résoudre. OTOH J'imagine que l'effet de manquer de mémoire du système d'exploitation peut être plus grave que de manquer de JVM PermGen, donc je ne suis pas sûr que ce soit une grande amélioration.

Que vous utilisiez une JVM avec PermGen ou avec Metaspace, si vous effectuez un déchargement de classe dynamique, vous devez prendre des mesures contre les fuites du chargeur de classe, par exemple en utilisant ma bibliothèque ClassLoader Leak Prevention .


17
Ni Permgen ni Metaspace ne contiennent d'instances de la classe Class. Ils ne conservent que les méta-informations sur les classes chargées. Les instances de la classe Class sont conservées dans un tas normal, comme les instances d'autres classes.
Moyenne Joe

Belle comparaison. Merci
Sandeep

1
Au fait, OTOH signifie, "De l'autre côté"
sofs1

43

Bye, Bye PermGen, Hello Metaspace

PermGen a été complètement supprimé.

Metaspace garbage collection - Le garbage collection des classes mortes et des chargeurs de classe est déclenché une fois que l'utilisation des métadonnées de classe atteint le MaxMetaspaceSize.

L'espace a Metadataété tenu n'est plus contigu au Java heap, Le metadataest maintenant déplacé vers la mémoire native dans une zone connue sous le nom de Metaspace.

En termes simples ,

Étant donné que les métadonnées de classe sont allouées en dehors de la mémoire native, l'espace disponible maximum est la mémoire système totale disponible. Ainsi, vous ne rencontrerez plus OOM errorset pourriez finir par se répandre dans l'espace d'échange.

La suppression de PermGenne signifie pas que vos problèmes de fuite de chargeur de classe ont disparu. Alors oui, vous devrez tout de même surveiller votre consommation et planifier en conséquence, car une fuite finirait par consommer toute votre mémoire native.

Quelques autres articles, avec analyse: Link1 , Link2 , et ceci


6
Au lieu de MaxPermGen, vous avez MaxMetaspaceSize, il n'y a donc aucune raison pour laquelle il utilisera plus ou moins de mémoire ou que vous ayez moins de contrôle.
Peter Lawrey

2
de quel souvenir parlons-nous ici? Mémoire RAM ou mémoire HDD.
Dinesh le

1
@Dinesh RAM (mémoire interne)
Aditya Gupta

10

En bref, la taille de Metaspace augmente automatiquement dans la mémoire native comme requis pour charger les métadonnées de classe si elles ne sont pas limitées avec -XX:MaxMetaspaceSize

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.