Permgen vs Metaspace en Java

Permgen vs Metaspace en Java

1. introduction

Dans ce tutoriel rapide,we’re going to examine the differences between the PermGen and Metaspace memory regions 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 (Permanent Generation) is a special heap space separated from the main memory heap.

La machine virtuelle Java garde une trace des métadonnées de classe chargées dans PermGen. En outre, la machine virtuelle Java 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,it contains data about bytecode, names and JIT information. Avant Java 7, le pool de chaînes faisait également partie de cette mémoire. Les inconvénients de la taille de pool fixe sont répertoriés dans noswrite-up.

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

Cependant, nous pouvons modifier la taille par défaut avec les options de la machine virtuelle Java:

  • -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.

With its limited memory size, PermGen is involved in generating the famous OutOfMemoryError. En termes simples, lesclass loadersne sont pas correctement récupérés et, par conséquent, ont généré une fuite de mémoire.

Par conséquent, nous recevons unmemory space error; cela se produit principalement dans l'environnement de développement lors de la création de nouveaux chargeurs de classe.

3. Métaspace

En termes simples, Metaspace est un nouvel espace mémoire - à partir de la version Java 8; it has replaced the older PermGen memory space. La différence la plus significative est la façon dont il gère l’allocation de mémoire.

En conséquence,this native memory region grows automatically by default. Ici, nous avons également de nouveaux drapeaux pour ajuster la mémoire:

  • MetaspaceSize etMaxMetaspaceSize – 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èsgarbage collection

  • MaxMetaspaceFreeRatio – est le pourcentage maximum de capacité de métadonnées de classe libre après un garbage collection pour éviter une réduction de la quantité d'espace

De plus, le processus de récupération de place tire également parti de cette modification. Le ramasse-miettes déclenche désormais automatiquement le nettoyage des classes mortes une fois que l'utilisation des métadonnées de classe a atteint sa taille maximale de méta-espace.

Par conséquent,with this improvement, JVM reduces the chance to get the OutOfMemory error.

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

4. Sommaire

Cette brève description présente une brève description des régions de mémoire PermGen et Metaspace. De plus, nous avons expliqué les principales différences entre chacune d’elles.

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