Pour la machine virtuelle Java de Sun/Oracle, j'ai lu que l'algorithme GC divise la nouvelle génération en une région Eden et en deux régions survivantes. Ce que je me demande, c'est pourquoi deux régions de survivants et pas une seule? L'algo peut continuer à jouer au ping-pong entre Eden et une seule région survivante (comme c'est actuellement le cas entre deux régions survivantes); ou y a-t-il des lacunes dans cette approche?
Je crois que l'implémentation de JRockit en GC fonctionne plus comme vous le suggérez, avec un seul espace eden et un espace survivant unique, mais ne me citez pas à ce sujet.
Les deux espaces survivants de la machine virtuelle HotSpot ont pour objectif de réduire le besoin de gérer la fragmentation. Les nouveaux objets sont alloués dans l'espace eden. Tout va bien. Quand c'est plein, vous avez besoin d'un GC, alors tuez les objets périmés et déplacez-les vivants dans un espace réservé aux survivants, où ils peuvent mûrir un moment avant d'être promus dans l'ancienne génération. Toujours bien jusqu'à présent. La prochaine fois que nous serons à court d'espace eden, nous aurons une énigme. Le prochain GC arrive et libère de l'espace dans eden et dans notre espace de survivants, mais les espaces ne sont pas contigus. Alors vaut-il mieux
La réponse de Sun à la question est évidente.
Le rôle de deux espaces de survivants est inversé après l'opération d'un ramassage mineur des ordures
Les deux espaces de survivants. Ces objets bloqués ont survécu à au moins une collecte de déchets mineure, mais ont eu une autre chance de devenir inaccessibles avant d'être promus à l'ancienne génération. Un seul d'entre eux contient des objets, tandis que l'autre est la plupart du temps inutilisé.
Pendant le fonctionnement d'un ramassage des ordures mineures, les objets qui se sont avérés être des ordures seront marqués. Les objets vivants dans l'EDEN qui survivent à la collection sont copiés dans l'espace de survivant inutilisé. Les objets vivants de l'espace de survivants en cours d'utilisation, qui auront une autre chance d'être récupérés par la jeune génération, sont également copiés dans l'espace de survivant inutilisé. Enfin, les objets vivants de l’espace du survivant en cours d’utilisation qui sont considérés comme «suffisamment vieux» sont promus dans l’ancienne génération.
À la fin de la collecte des ordures mineures, les deux espaces de survivants échangent leurs rôles. L'eden est entièrement vide; un seul espace de survivant est utilisé; et l'occupation de l'ancienne génération a légèrement augmenté. Étant donné que les objets vivants sont copiés au cours de son fonctionnement, ce type de garbage collector est appelé un garbage collector.
Source: ci-dessus, extraits de la page 83 de Java Performance, de Charlie Hunt et Binu John.
Jeune génération: C'est un endroit où il a vécu pendant une courte période et divisé en deux espaces:
Eden space: De nouveaux objets seront alloués dans le pool de mémoire. L'hypothèse est que la plupart des objets sont déréférencés et deviennent inaccessibles peu après leur création. Les objets non référencés seront copiés par le récupérateur de place de nouvelle génération dans les espaces survivants. Ils peuvent être copiés dans certains cas particuliers directement dans le pool de la génération précédente.
Espaces Survivants: Ces deux petits espaces conservent les objets survivants d'une collecte de déchets de la jeune génération. Les objets survivants seront copiés un (petit) nombre de fois d’un survivant à l’autre. Cela permet de récolter nos objets les plus déréférencés.
Ancienne génération: Le plus grand pool de mémoire qui devrait conserver les objets de longue durée. Les objets sont copiés dans ce pool une fois qu'ils ont quitté les espaces de survivants.
Génération de Permament: Ce pool relativement inconnu conserve les informations de toutes les classes. Il ne nécessite aucune attention pour la plupart des applications. Il peut être nécessaire de l'adapter à certaines applications comportant de nombreuses classes. Une attention particulière peut également être nécessaire si l'application charge et décharge en permanence des classes.
Autres avantages:
Veuillez trouver les liens suivants pour plus de détails qui peuvent vous aider à mieux comprendre
Toutes les réponses actuelles parlent de fragmentation de la mémoire, c’est aussi une autre raison d’avoir des générations en GC.
Le moteur d'exécution enregistre tous les «anciens objets» qui pointent vers de «nouveaux objets». Cette opération est effectuée chaque fois qu'un champ de «pointeur» est mis à jour. Ensuite, lorsqu'un GC "mineur" est terminé, seuls les "nouveaux" objets doivent être scannés.
Au fil des ans, il a été constaté que le simple «nouveau» et le «vieux» ne suffisaient pas, et il est bon d’avoir une 3ème génération «d'âge moyen».
Quels sont les avantages et les inconvénients de la copie de toutes les instances d'une génération d'un espace à un autre, par opposition à une copie dans l'ordre des adresses mémoire jusqu'au début de l'espace d'une génération? Le traitement des éléments dans l'ordre nécessiterait probablement l'ajout d'un pointeur supplémentaire par élément, mais éliminerait la nécessité d'un des espaces "survivants".
Mémoire de tas en Java Objets Java créés dans une zone appelée mémoire de tas. La mémoire de tas est créée au démarrage de la machine virtuelle Java, la mémoire de tas est augmentée ou diminuée lors de l'exécution d'une application Java. Lorsque la mémoire est pleine, le ramasse-miettes supprime les objets inutilisés. Le ramasse-miettes crée ainsi un espace pour les nouveaux objets.
La mémoire de tas est divisée en deux zones (ou générations) appelées
1.un jeune espace. 2.old space.
1.Dans un espace jeune, il y a un espace Eden pour un nouvel objet et il y a deux espaces Survivor (de et vers), ces deux espaces Survivor sont toujours de la même taille.
2.Les espaces survivant servent à stocker des objets de survie. Lorsque le jeune espace est plein, le ramasse-miettes supprime les objets inutilisés en exécutant une jeune collection spéciale, dans laquelle tous les objets ayant vécu suffisamment longtemps dans cet espace sont ancien espace, libérant ainsi le jeune espace pour une plus grande allocation d'objets.
3.Si l'espace Eden est saturé, le GC s'exécutera. Si des objets sont vivants dans cet espace Eden, ceux-ci sont déplacés vers l'espace Survivor.
4.Dans un espace jeune, le GC utilise normalement l'algorithme de copie, qui est rapide. Chaque fois, les objets de survie sont copiés dans l'un des espaces de survivant.
5.Si l'espace de survivant est plein, les objets restants sont directement copiés dans l'ancien espace.
6. Dans le vieil espace, le GC utilise normalement l’algorithme Mark-Compact, qui est lent mais nécessite moins de mémoire.
7.Lorsque l'ancien espace devient plein, des ordures y sont collectées, un processus appelé une ancienne collection. Dans Ancien espace, longue durée de vie, les objets y restent.
8.Out of Memory se produira, il n'y a pas de place pour un nouvel objet, même une GC faite pour une pièce ancienne ou permanente.
9.L'objet est déplacé pendant le ramassage des ordures: eden -> survivant -> permanent (ancien espace)
Deux survivants sont la mise en œuvre de l'algorithme de marquage et de copie. Ceux-ci sont utilisés dans GC pour la jeune génération. Comme mentionné par Ryan dans l'option 3 ici