Permgen vs Metaspace en Java

1. Introduction

Dans ce rapide tutoriel, nous allons examiner les différences entre les régions de mémoire PermGen et Metaspace dans l'environnement Java.

Il est important de garder à l'esprit que, à partir de Java 8, le Metaspace remplace le PermGen - apportant des changements substantiels.

2. PermGen

PermGen (génération permanente) est un espace de tas spécial séparé du tas de mémoire principale .

La JVM garde une trace des métadonnées de classe chargées dans PermGen. En outre, la JVM stocke tout le contenu statique dans cette section de mémoire. Cela inclut toutes les méthodes statiques, les variables primitives et les références aux objets statiques.

De plus, il contient des données sur le bytecode, les noms et les informations JIT . Avant Java 7, le String Pool faisait également partie de cette mémoire. Les inconvénients de la taille de pool fixe sont répertoriés dans notre article.

La taille de mémoire maximale par défaut pour la JVM 32 bits est de 64 Mo et de 82 Mo pour la version 64 bits.

Cependant, nous pouvons changer la taille par défaut avec les options JVM:

  • -XX: PermSize = [size] est la taille initiale ou minimale de l'espace PermGen
  • -XX: MaxPermSize = [size] est la taille maximale

Plus important encore, Oracle a complètement supprimé cet espace mémoire dans la version JDK 8. Par conséquent, si nous utilisons ces indicateurs de réglage dans Java 8 et les versions plus récentes, nous recevrons les avertissements suivants:

>> java -XX:PermSize=100m -XX:MaxPermSize=200m -version OpenJDK 64-Bit Server VM warning: Ignoring option PermSize; support was removed in 8.0 OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0 ...

Avec sa taille de mémoire limitée, PermGen est impliqué dans la génération du célèbre OutOfMemoryError . En termes simples, les chargeurs de classe n'étaient pas correctement récupérés et, par conséquent, ont généré une fuite de mémoire.

Par conséquent, nous recevons une erreur d'espace mémoire; cela se produit principalement dans l'environnement de développement lors de la création de nouveaux chargeurs de classe.

3. Metaspace

En termes simples, Metaspace est un nouvel espace mémoire - à partir de la version Java 8; il a remplacé l'ancien espace mémoire PermGen . La différence la plus significative est la façon dont il gère l'allocation de mémoire.

Plus précisément, cette région de mémoire native augmente automatiquement par défaut .

Nous avons également de nouveaux indicateurs pour régler la mémoire:

  • MetaspaceSize et MaxMetaspaceSize - nous pouvons définir les limites supérieures de Metaspace.
  • MinMetaspaceFreeRatio - est le pourcentage minimum de capacité de métadonnées de classe libre après le garbage collection
  • MaxMetaspaceFreeRatio - est le pourcentage maximal de capacité de métadonnées de classe libre après un garbage collection pour éviter une réduction de la quantité d'espace

En outre, le processus de récupération de place bénéficie également de certains avantages de cette modification. Le garbage collector déclenche désormais automatiquement le nettoyage des classes mortes une fois que l'utilisation des métadonnées de classe atteint sa taille maximale de méta-espace.

Par conséquent, avec cette amélioration, JVM réduit le risque d'obtenir l' erreur OutOfMemory .

Malgré toutes ces améliorations, nous devons toujours surveiller et régler la méta-espace pour éviter les fuites de mémoire.

4. Résumé

Dans cet article rapide, nous avons présenté une brève description des régions de mémoire PermGen et Metaspace. De plus, nous avons expliqué les principales différences entre chacun d'eux.

PermGen existe toujours avec JDK 7 et les versions antérieures, mais Metaspace offre une utilisation de la mémoire plus flexible et plus fiable pour nos applications.