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 space
ne peut plus être lancée et que le paramètre VM MaxPermSize
est ignoré.
Réponses:
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.Class
instances 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 .
la source
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 auJava heap
, Lemetadata
est maintenant déplacé vers la mémoire native dans une zone connue sous le nom deMetaspace
.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 errors
et pourriez finir par se répandre dans l'espace d'échange.La suppression de
PermGen
ne 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
la source
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
la source