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?
Réponses
Trop de publicités?Je crois JRockit GC de la mise en œuvre fonctionne plus comme vous le suggérez, avec juste un seul eden et unique survivant de l'espace, mais de ne pas me citer sur ce point.
La raison de la JVM HotSpot de deux survivants des espaces est de réduire la nécessité de faire face à la fragmentation. De nouveaux objets sont alloués dans l'eden de l'espace. Tout cela est bien beau. Quand c'est plein, vous avez besoin d'un GC, donc tuer rassis objets et les déplacer en direct à un survivant de l'espace, où ils peuvent mûrir pendant un certain temps avant d'être promu à l'ancienne génération. Encore bonne jusqu'à présent. La prochaine fois que nous sommes à court d'eden de l'espace, bien que, nous avons une énigme. La prochaine GC arrive et libère de l'espace dans eden et de notre survivant de l'espace, mais les espaces ne sont pas contigus. Ainsi est-il préférable d'
- Essayez de faire entrer les survivants de l'eden dans les trous dans le survivant de l'espace qui ont été autorisés par la GC?
- Maj tous les objets dans le survivant de l'espace en bas pour éliminer la fragmentation, et puis déplacer les survivants?
- Il suffit de dire "fuck it, nous nous dirigeons tout autour de toute façon," et la copie de tous les survivants des deux espaces en un complètement séparée de l'espace, de la seconde survivant de l'espace--ainsi, vous laissant avec de l'eden et survivant de l'espace où vous pouvez répéter la séquence sur la prochaine GC?
Le soleil, la réponse à la question est évidente.
Le rôle des deux survivants des espaces obtient inversée après l'opération d'un mineur de collecte des ordures
Les deux survivants des espaces. Ces objets qui ont survécu à au moins un mineur de collecte des ordures, mais ont donné une autre chance de devenir inaccessible, avant d'être promu à l'ancienne génération. Un seul d'entre eux est titulaire d'objets, tandis que l'autre est la plupart du temps inutilisés.
Au cours de l'opération d'un mineur, la collecte des ordures, les objets qui ont été trouvés à être des ordures sera marqué. Les objets vivants dans l'eden qui survivent à la collecte sont copiés sur le solde non utilisé de survivant de l'espace. Les objets vivants dans le survivant de l'espace qui est en cours d'utilisation, ce qui donnera une autre chance d'être récupéré dans la jeune génération, sont également copiés dans le inutilisés survivant de l'espace. Enfin, les objets vivants dans le survivant de l'espace qui est en cours d'utilisation, qui sont considérés comme "assez vieux", sont promus à l'ancienne génération.
À la fin de la mineure de collecte des ordures, les deux survivants des espaces d'échange les rôles. L'eden est entièrement vide; seul survivant de l'espace est en cours d'utilisation; et l'occupation de l'ancienne génération a augmenté légèrement. Parce que les objets vivants sont copiées au cours de son fonctionnement, ce type de garbage collector est appelé une copie du garbage collector.
Source : ci-dessus sont extraits à partir de la page 83 de la Performance Java, par Charlie Chasse et de Binu Jean.
La jeune génération (nommé ainsi d'Eden de l'espace): les Nouveaux objets seront alloués dans le pool de mémoire. L'hypothèse est que la plupart des objets d'obtenir déréférencé et devenir inaccessible peu après leur création. Objets qui ne sont pas déréférencé sera copié par la nouvelle génération de garbage collector dans le survivant des espaces. Ils peuvent être copiés n certains cas spéciaux directement dans l'ancienne génération de la piscine.
Survivant espaces: Ces deux petits espaces de garder les objets survivants d'une jeune génération de collecte des ordures. Objets survivants seront copiés pour un (petit) nombre de fois à partir d'un survivant dans l'autre. Cela permet de récolter nos plus déréférencé des objets.
La vieille génération: Le plus grand pool de mémoire qui doit garder le long vie à des objets. Les objets se sont copiés dans cette piscine une fois qu'ils quittent le survivant des espaces.
Permanent génération: Ce assez inconnu de la piscine garde les informations de toutes les classes. Il n'a pas besoin de toute l'attention pour la plupart des applications. Il peut avoir besoin d'être adaptés pour certaines applications avec un grand nombre de classes. Il peut avoir besoin de certaines attentention ainsi, si la demande en permanence de charge et décharge des classes.
Vous trouverez les liens ci-dessous pour plus de détails qui peuvent vous aider à comprendre plus
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 runtime enregistre tous les "anciens objets" qui pointent vers de "nouveaux objets". Cette opération est effectuée chaque fois qu'un champ "pointeur" est mis à jour. Ensuite, lorsqu'un GC "mineur" est terminé, seuls les "nouveaux" objets doivent être analysés.
Au fil des ans, il a été constaté qu’il ne suffisait pas d’avoir du "nouveau" et du "vieux", 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".