L'allocation et la libération de la mémoire dans Java et C # sont automatiquement gérées par des machines virtuelles. J'ai précédemment introduit la méthode de recyclage des objets GC dans CLR, qui est une stratégie de recyclage de la mémoire basée sur la génération. En fait, en Java, la stratégie de recyclage des objets JVM est également basée sur l'idée de la division générationnelle. Le but de cela est d'augmenter les ordures
Les performances du recyclage évitent le retard dans la réponse du programme provoquée par la vérification de tous les objets dans le tas, car lorsque JVM exécute GC, il arrête le mot, c'est-à-dire termine le fonctionnement d'autres threads et ne restaure que les opérations d'autres threads une fois le recyclage terminé. L'idée basée sur la division générationnelle est: JVM n'a besoin que d'une petite partie de la mémoire à chaque fois qu'il exécute le collecteur des ordures.
Les références d'objets sont vérifiées, et ce petit nombre d'objets a un cycle de vie plus court, ce qui accélère les performances de la collection des ordures. Ci-dessous, nous présenterons les stratégies de base des algorithmes de récupération de mémoire basés sur des génération en Java à l'avenir:
1. Division de génération de la mémoire de tas JVM
Dans une stratégie de récupération de la mémoire basée sur la génération, l'espace de tas est généralement divisé en 3 générations, une jeune génération, une vieille génération (ou une génération titulaire) et une génération permanente. Parmi la jeune génération, il y a trois petites zones: Eden, S0 et S1, comme le montre la figure ci-dessous:
Parmi eux, les nouveaux objets sont toujours affectés à la génération d'âge. Lorsque l'espace de la jeune génération est rempli, une collection d'ordures doit être effectuée, c'est-à-dire que le GC mineur est exécuté, pour recycler les objets qui ne sont plus référencés et en même temps augmenter l'âge des objets survivants. Les objets survivants dans la génération d'âge ont un champ d'identification d'âge. Une fois qu'ils atteignent un certain seuil, les objets encore survivants seront promus dans l'ancien espace de génération.
L'espace de l'ancienne génération est utilisé pour stocker des objets qui ont survécu pendant longtemps, c'est-à-dire des objets avec un long cycle de vie. Une fois que les objets survivants dans l'espace de la jeune génération atteignent un certain seuil d'âge, il sera automatiquement promu à l'ancienne génération. Lorsque l'espace de l'ancienne génération est rempli d'objets, le major GC sera exécuté une fois. Par rapport au GC mineur, le nombre d'exécutions de GC majeur est bien inférieur à celui du GC mineur. Dans le même temps, le major GC exécute plus longtemps que le GC mineur. Car il implique plus de balayage d'objets. Cette idée générationnelle est également basée sur le meilleur choix dans la pratique que dans la pratique, les objets nouvellement alloués ont un cycle de vie plus court et les objets âgés ont un cycle de vie plus long.
Dans le même temps, lorsque Minor GC et Major GC effectuent une collection de ordures, ils prennent l'arrêt de l'événement mondial, c'est-à-dire terminer les threads en cours d'exécution et restaurer tous les threads lorsque le GC est exécuté.
Pour la mémoire de génération permanente, il est principalement utilisé pour stocker des informations pertinentes sur les métadonnées, les informations des classes et des méthodes. Lorsqu'une classe n'est plus utilisée, elle sera recyclée. Lorsque le GC complet est exécuté, la mémoire de génération permanente sera scannée pour la collecte des ordures.
2. Processus de traitement de la collection de déchets basée sur la génération
Tout d'abord, au début, le nouvel objet est affecté à la zone Eden, S0 et S1 sont vides. Lorsque l'espace à Eden est rempli, effectuez une fois Minor GC. Le collecteur des ordures déplacera l'objet référencé vers la zone S0 et les objets qui ne sont plus référencés seront supprimés. Dans le même temps, l'âge de l'objet survivant est 1. Une fois GC identifié, les zones Eden et S1 sont vides comme indiqué sur la figure ci-dessous.
La prochaine fois que GC mineur sera exécuté, comme les étapes d'exécution précédentes, la seule différence est que l'objet référencé, c'est-à-dire l'objet survivant, sera déplacé vers la zone S1, et l'âge de l'objet survivant dans la zone S0 augmentera de 1 et deviendra 2, comme le montre la figure ci-dessous.
Lorsque le GC mineur est à nouveau exécuté, l'objet survivant sera déplacé vers la zone S0 et ajoutera 1 à l'âge de l'objet survivant comme indiqué sur la figure ci-dessous
Lorsque le GC mineur est finalement exécuté, il est constaté que l'objet survivant en S1 atteint 8 (en supposant que le seuil est défini sur 8), et l'objet sera promu dans la mémoire de vieillesse, comme indiqué sur la figure ci-dessous.
Z
Lorsque l'ancien espace de tas est rempli d'objets, le major GC sera exécuté une fois, ce qui effacera les objets que l'ancien tas n'est plus référencé et en même temps, comprimera l'espace. Comme indiqué dans la figure ci-dessous.
La brève discussion ci-dessus sur la stratégie de recyclage des ordures dans JVM est tout le contenu que je partage avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.