Fonctionnement de Garbage Collection dans une machine virtuelle Java


  • FrançaisFrançais


  • Automatic Garbage Collection (GC) est l’une des fonctionnalités les plus importantes qui rendent Java si populaire. Cet article explique pourquoi GC est essentiel. Il inclut le GC automatique et générationnel, comment la machine virtuelle Java (JVM) divise la mémoire de tas et enfin, comment le GC fonctionne à l’intérieur de la JVM.

    Allocation de mémoire Java

    La mémoire Java est divisée en quatre sections :

    1. Tas : la mémoire des instances d’objet est allouée dans le tas. Lorsque la déclaration d’objet est faite, il n’y aura pas de mémoire allouée dans le tas. Au lieu de cela, une référence est créée pour cet objet dans la pile.
    2. Stack : cette section alloue la mémoire pour les méthodes, les variables locales et les variables d’instance de classe.
    3. Code : le bytecode réside dans cette section.
    4. Statique : les données et les méthodes statiques sont placées dans cette section.

    Qu’est-ce que le Garbage Collection (GC) automatique ?

    Le GC automatique est un processus dans lequel les objets référencés et non référencés dans la mémoire de tas sont identifiés, puis les objets non référencés sont pris en compte pour suppression. Le terme objets référencés signifie qu’une partie de votre programme utilise ces objets. Objets non référencés ne sont pas actuellement utilisés par le programme.

    Les langages de programmation tels que C et C++ nécessitent une allocation et une désallocation manuelles de la mémoire. Ceci est automatiquement géré par GC en Java, bien que vous puissiez déclencher GC manuellement avec le system.gc(); appelez votre code.

    Les étapes fondamentales du GC sont :

    1. Marquez les objets utilisés et inutilisés

    Dans cette étape, les objets utilisés et non utilisés sont marqués séparément. Il s’agit d’un processus qui prend du temps, car tous les objets en mémoire doivent être analysés pour déterminer s’ils sont utilisés ou non.

    (Jayashree Huttanagoudar, CC BY-SA 4.0)

    2. Balayer/supprimer des objets

    Il existe deux variantes de balayage et de suppression.

    Suppression simple: Seuls les objets non référencés sont supprimés. Cependant, l’allocation de mémoire pour de nouveaux objets devient difficile car l’espace libre est dispersé dans la mémoire disponible.

    (Jayashree Huttanagoudar, CC BY-SA 4.0)

    Suppression avec compactage: Outre la suppression des objets non référencés, les objets référencés sont compactés. L’allocation de mémoire pour de nouveaux objets est relativement facile et les performances d’allocation de mémoire sont améliorées.

    (Jayashree Huttanagoudar, CC BY-SA 4.0)

    Qu’est-ce que la récupération de place générationnelle (GC) et pourquoi est-elle nécessaire ?

    Comme on le voit dans le modèle de balayage et de suppression, l’analyse de tous les objets pour la récupération de mémoire à partir d’objets inutilisés devient difficile une fois que les objets continuent de croître. Une étude expérimentale montre que la plupart des objets créés lors de l’exécution du programme sont de courte durée.

    L’existence d’objets de courte durée peut être utilisée pour améliorer les performances de GC. Pour cela, la JVM divise la mémoire en différentes générations. Ensuite, il catégorise les objets en fonction de ces générations de mémoire et effectue le GC en conséquence. Cette approche est connue sous le nom de GC générationnel.

    Générations de mémoire de tas et processus générationnel de récupération de place (GC)

    Pour améliorer les performances des étapes de marquage et de balayage GC, la JVM divise la mémoire de tas en trois générations :

    • Jeune génération
    • Ancienne génération
    • Génération permanente

    (Jayashree Huttanagoudar, CC BY-SA 4.0)

    Voici une description de chaque génération et de ses principales caractéristiques.

    Jeune génération

    Tous les objets créés sont présents ici. La jeune génération est en outre divisée en:

    1. Eden : Tous les objets nouvellement créés sont alloués avec la mémoire ici.
    2. Espace survivant (S0 et S1) : après avoir survécu à un GC, les objets vivants sont déplacés vers l’un de ces espaces survivants.

    (Jayashree Huttanagoudar, CC BY-SA 4.0)

    Le GC générationnel qui se produit dans la jeune génération est connu sous le nom de GC mineur. Tous les cycles GC mineurs sont des événements “Stop the World” qui provoquent la pause des autres applications jusqu’à la fin du cycle GC. C’est pourquoi les cycles GC mineurs sont plus rapides.

    Pour résumer : l’espace Eden dispose de tous les objets nouvellement créés. Une fois qu’Eden est plein, le premier cycle de GC mineur est déclenché.

    (Jayashree Huttanagoudar, CC BY-SA 4.0)

    GC mineur : Les objets vivants et morts sont marqués durant ce cycle. Les objets vivants sont déplacés vers l’espace survivant S0. Une fois que tous les objets actifs sont déplacés vers S0, les objets non référencés sont supprimés.

    (Jayashree Huttanagoudar, CC BY-SA 4.0)

    L’âge des objets dans S0 est de 1 car ils ont survécu à un GC mineur. Maintenant Eden et S1 sont vides.

    Une fois nettoyé, l’espace Eden est à nouveau rempli de nouveaux objets vivants. Au fil du temps, certains objets dans Eden et S0 deviennent morts (non référencés), et l’espace d’Eden est à nouveau plein, déclenchant le GC mineur.

    (Jayashree Huttanagoudar, CC BY-SA 4.0)

    Cette fois, les objets morts et vivants dans Eden et S0 sont marqués. Les objets vivants d’Eden sont déplacés vers S1 avec un incrément d’âge de 1. Les objets vivants de S0 sont également déplacés vers S1 avec un incrément d’âge de 2 (car ils ont maintenant survécu à deux GC mineurs). À ce stade, S0 et Eden sont vides. Après chaque GC mineur, Eden et l’un des espaces survivants sont vides.

    Le même cycle de création de nouveaux objets dans Eden se poursuit. Lorsque le prochain GC mineur se produit, Eden et S1 sont effacés en déplaçant les objets âgés vers S0. Les espaces survivants changent après chaque GC mineur.

    (Jayashree Huttanagoudar, CC BY-SA 4.0)

    Ce processus se poursuit jusqu’à ce que l’âge de l’un des objets survivants atteigne un certain seuil, moment auquel il est déplacé vers la soi-disant ancienne génération avec un processus appelé promotion.

    De plus, le -Xmn flag définit la taille de la jeune génération.

    Ancienne génération (génération titulaire)

    Cette génération contient les objets qui ont survécu à plusieurs GC mineurs et vieilli pour atteindre un seuil attendu.

    (Jayashree Huttanagoudar, CC BY-SA 4.0)

    Dans l’exemple de diagramme ci-dessus, le seuil est de 8. Le GC dans l’ancienne génération est connu sous le nom de GC majeur. Utilisez les drapeaux -Xms et -Xmx pour définir la taille initiale et maximale de la mémoire de tas.

    Génération permanente

    L’espace de génération permanente stocke les métadonnées liées aux classes de bibliothèque et aux méthodes d’une application, J2SE, et ce qui est utilisé par la JVM elle-même. La JVM remplit ces données au moment de l’exécution en fonction des classes et des méthodes utilisées. Une fois que la JVM trouve les classes inutilisées, elles sont déchargées ou collectées, laissant de la place aux classes utilisées.

    Utilisez les drapeaux -XX:PermGen et -XX:MaxPermGen pour définir la taille initiale et maximale de la génération permanente.

    Métaespace

    Metaspace a été introduit dans Java 8u et a remplacé PermGen. L’avantage est le redimensionnement automatique, qui évite les erreurs OutOfMemory.

    Emballer

    Cet article traite des différentes générations de mémoire de JVM et de leur utilité pour le Garbage Collection (GC) générationnel automatique. Comprendre comment Java gère la mémoire n’est pas toujours nécessaire, mais cela peut vous aider à imaginer comment la JVM gère vos variables et vos instances de classe. Cette compréhension vous permet de planifier et de dépanner votre code et de comprendre les limitations potentielles inhérentes à une plate-forme spécifique.

    Source

    La Rédaction

    L'équipe rédactionnnelle du site

    Pour contacter personnellement le taulier :

    Laisser un commentaire

    Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

    Copy code