Un ramasseur de déchets commence à partir d'un ensemble "racine" d'endroits qui sont toujours considérés comme "accessibles", tels que les registres du CPU, la pile et les variables globales. Il travaille en trouvant tous les pointeurs dans ces zones, et en trouvant récursivement tout ce vers quoi ils pointent. Une fois qu'il a trouvé tout ça, tout le reste est de la merde.
Il existe, bien sûr, de nombreuses variantes, principalement pour des raisons de rapidité. Par exemple, la plupart des ramasseurs de déchets modernes sont "générationnels", ce qui signifie qu'ils divisent les objets en générations, et qu'au fur et à mesure qu'un objet vieillit, le ramasseur de déchets passe de plus en plus de temps entre les moments où il essaie de déterminer si cet objet est toujours valide ou non -- il commence simplement à supposer que s'il a vécu longtemps, il y a de bonnes chances qu'il continue à vivre encore plus longtemps.
Néanmoins, l'idée de base reste la même : il s'agit de partir d'un ensemble d'éléments de base dont on suppose qu'ils peuvent encore être utilisés, puis de rechercher tous les pointeurs pour trouver ce qui pourrait être utilisé.
Aparté intéressant : les gens sont souvent surpris par le degré de similitude entre cette partie d'un garbage collector et le code pour le marshaling d'objets pour des choses comme les appels de procédure à distance. Dans chaque cas, on part d'un ensemble d'objets racine, et on recherche les pointeurs pour trouver tous les autres objets auxquels ils font référence...
1 votes
Voir : stackoverflow.com/questions/407855/ en particulier la deuxième réponse de @gnud.