web-dev-qa-db-fra.com

Quelle est la différence entre PermGen et Metaspace?

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

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

La seule différence que je connaisse est que Java.lang.OutOfMemoryError: PermGen space ne peut plus être lancé et le VM paramètre MaxPermSize est ignoré.

104
Kao

La principale différence du point de vue de l'utilisateur - ce que la réponse précédente, à mon avis, ne souligne pas suffisamment - réside dans le fait que le méta-espace 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 les paramètres JVM, mais vous ne pouvez pas augmenter automatiquement PermGen.

Dans une large mesure, il ne s'agit que d'un changement de nom. À l'époque de l'introduction de PermGen, il n'y avait pas de chargement Java EE ou de classe dynamique). Ainsi, une classe chargée était bloquée en mémoire jusqu'à la fermeture de la machine virtuelle - ainsi Permanent Génération. De nos jours, les classes peuvent être chargées et déchargées pendant la durée de vie de la machine virtuelle Java. Metaspace a donc plus de sens pour la zone dans laquelle les métadonnées sont conservées.

Les deux contiennent le Java.lang.Class _ instances et les deux souffrent de fuites ClassLoader . La seule différence est que, avec les paramètres par défaut de Metaspace, le délai est plus long avant que vous ne remarquiez les symptômes (puisqu’il augmente automatiquement au maximum), c’est-à-dire que vous éloignez simplement le problème sans le résoudre. OTOH J'imagine que le fait de manquer de mémoire du système d'exploitation peut être plus grave que de tomber à court de JVM PermGen. Je ne suis donc pas sûr que ce soit une amélioration importante.

Que vous utilisiez une machine virtuelle avec PermGen ou Metaspace, si vous effectuez un déchargement de classe dynamique, vous devez prendre des mesures contre les fuites du chargeur de classes, par exemple en utilisant my bibliothèque de prévention des fuites ClassLoader .

123
Mattias Jiderhamn

Aurevoir, au revoir PermGen, Hello Metaspace

PermGen a été complètement supprimé.

Collecte de mémoire Metaspace - La récupération de mémoire des classes mortes et des chargeurs de classe est déclenchée une fois que l'utilisation des métadonnées de classe a atteint le MaxMetaspaceSize.

L'espace Metadata qui s'est tenu n'est plus contigu au Java heap, metadata a été déplacé en mémoire native vers une zone appelée Metaspace.

En mots simples ,

Étant donné que les métadonnées de classe sont allouées en dehors de la mémoire native, l'espace disponible maximal est la mémoire système totale disponible. Ainsi, vous ne rencontrerez plus OOM errors et pourrait se retrouver dans l’espace de permutation.

La suppression de PermGen ne signifie pas que vos problèmes de fuite de chargeur de classe ont disparu. Donc, oui, vous devrez toujours 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 this

34
Ankur Singhal

En bref, la taille de la méta-espace augmente automatiquement dans la mémoire native si nécessaire pour charger des métadonnées de classe si elle n’est pas restreinte avec -XX:MaxMetaspaceSize

9
Chandrasekaran