En résumé : les récupérateurs n'utilisent pas la récursivité. Ils contrôlent simplement le traçage en conservant essentiellement deux ensembles (qui peuvent se combiner). L'ordre de traçage et de traitement des cellules est sans importance, ce qui donne une liberté d'implémentation considérable pour représenter les ensembles. Par conséquent, il existe de nombreuses solutions qui sont en fait très bon marché dans l'utilisation de la mémoire. Ceci est essentiel car le GC est appelé précisément lorsque le tas manque de mémoire. Les choses sont un peu différentes avec de grandes mémoires virtuelles, car les nouvelles pages peuvent être facilement allouées, et l'ennemi n'est pas le manque d'espace, mais le manque de localisation des données
.
Je suppose que vous envisagez de rechercher les récupérateurs, et non de compter les références pour lesquelles votre question ne semble pas s'appliquer.
UV
La première chose à noter est que tous les GC de traçage suivent le même modèle abstrait, basé sur l'exploration systématique du graphe dirigé de cellules en mémoire accessible depuis le programme, où les cellules mémoire sont des sommets et des pointeurs sont les bords dirigés. Il utilise pour cela les ensembles suivants:
VVV= U∪ T
U
T
H
VUUT
UV
UcVUcUT
UUV= TVH- VV
VUUT
Je saute également des détails sur ce qu'est une cellule, qu'elle existe en une ou plusieurs tailles, comment nous y trouvons des pointeurs, comment ils peuvent être compactés et une foule d'autres problèmes techniques que vous pouvez trouver dans des livres et des enquêtes sur la collecte des ordures. .
U
Là où les implémentations connues diffèrent, c'est dans la façon dont ces ensembles sont réellement représentés. De nombreuses techniques ont été effectivement utilisées:
bitmap: Un espace mémoire est conservé pour une carte qui a un bit pour chaque cellule de mémoire, qui peut être trouvé en utilisant l'adresse de la cellule. Le bit est activé lorsque la cellule correspondante est dans l'ensemble défini par la carte. Si seules des mappes de bits sont utilisées, vous n'avez besoin que de 2 bits par cellule.
Alternativement, vous pouvez avoir de l'espace pour un bit d'étiquette spécial (ou 2) dans chaque cellule pour le marquer.
bûche2pp
vous pouvez tester un prédicat sur le contenu de la cellule et ses pointeurs.
vous pouvez déplacer la cellule dans une partie libre de la mémoire destinée à toutes et uniquement aux cellules appartenant à l'ensemble représenté.
VTTU
vous pouvez réellement combiner ces techniques, même pour un seul ensemble.
Comme dit, tout ce qui précède a été utilisé par certains ramasse-miettes mis en œuvre, aussi étrange que cela puisse paraître. Tout dépend des différentes contraintes de l'implémentation. Et ils peuvent être plutôt bon marché dans l'utilisation de la mémoire, peut-être aidés par le traitement des politiques de commande qui peuvent être librement choisies à cet effet, car elles n'ont pas d'importance pour le résultat final.
Ce qui peut sembler le plus étrange, le transfert de cellules dans une nouvelle zone, est en fait très courant: il s'agit de la collection de copies. Il est principalement utilisé avec la mémoire virtuelle.
De toute évidence, il n'y a pas de récursivité et la pile d'algorithmes de mutation n'a pas à être utilisée.
Un autre point important est que de nombreux GC modernes sont implémentés pour les grandes mémoires virtuelles . Ensuite, obtenir de l'espace pour implémenter et une liste ou une pile supplémentaire n'est pas un problème car les nouvelles pages peuvent être facilement allouées. Cependant, dans les grands souvenirs virtuels, l'ennemi n'est pas le manque d'espace mais le manque de localité . Ensuite, la structure représentant les ensembles, et leur utilisation, doit être orientée vers la préservation de la localité de la structure des données et de l'exécution du GC. Le problème n'est pas l'espace mais le temps. Des implémentations inadéquates sont plus susceptibles de montrer un ralentissement inacceptable qu'un débordement de mémoire.
Je n'ai pas fait référence aux nombreux algorithmes spécifiques, résultant de diverses combinaisons de ces techniques, car cela semble assez long.