Quelle est la différence entre PermGen et Metaspace?

Jusqu'à Java 7 Il y avait une zone dans la mémoire de JVM appelée PermGen , où JVM utilisé pour garder ses classes. Dans Java 8 il a été enlevé 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 sais est que java.lang.OutOfMemoryError: PermGen space ne peut plus être lancé et le paramètre VM MaxPermSize est ignoré.

83
demandé sur Kao 2014-11-25 18:52:35

3 réponses

la principale différence du point de vue de l'utilisateur - que je pense que la réponse précédente ne met pas assez l'accent - est que Metaspace par défaut augmente automatiquement sa taille (jusqu'à ce que l'OS 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 faire de PermGen auto increase.

dans une large mesure, il s'agit simplement d'un changement de nom. De retour lors de la PermGen a été introduit, il n'y avait pas de chargement Java EE ou de classe dynamique(un), donc une fois qu'une classe était chargée, elle était bloquée en mémoire jusqu'à ce que la JVM ferme - 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 est plus logique pour la zone où les métadonnées sont conservées.

toutes deux contiennent les instances java.lang.Class et toutes deux souffrent de ClassLoader leaks . Seulement la 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 qu'il peut), i.e. vous poussez juste le problème plus loin sans le résoudre. OTOH j'imagine que l'effet de manquer de mémoire OS peut être plus sévère que de simplement manquer de PermGen JVM, donc je ne suis pas sûr qu'il est beaucoup d'une amélioration.

que vous utilisiez un JVM avec PermGen ou avec Metaspace, si vous faites du déchargement de classe dynamique, vous devrait prendre des mesures contre les fuites de classloader, par exemple en utilisant ma ClassLoader Leak prevention library .

97
répondu Mattias Jiderhamn 2014-11-26 08:12:12

Bye, Bye PermGen, Hello Metaspace

PermGen a été complètement supprimé.

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

l'espace Metadata n'est plus contigu au Java heap , le metadata est maintenant passé à la mémoire des Autochtones dans une région connue sous le nom de Metaspace .

en mots simples ,

étant donné que les métadonnées de classe sont attribuées à partir de la mémoire native, l'espace maximum disponible est la mémoire système totale disponible. Ainsi, vous ne rencontrerez plus OOM errors et pourriez finir par déborder dans l'espace d'échange.

l'enlèvement de PermGen ne signifie pas que votre chargeur de classe fuite les problèmes ont disparu. Donc, oui, vous devrez tout de même surveiller votre consommation et planifier en conséquence, car une fuite finirait par consumer toute votre mémoire natale.

quelques autres articles, avec analyse: Link1 , Link2 , et this

27
répondu Ankur Singhal 2017-05-23 12:10:30

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

7
répondu Chandrasekaran 2016-09-13 10:58:28