2010-06-26 2 views

Répondre

8

Non, il n'y a pas de "liste de références". Le GC n'a pas besoin de savoir tout ce qui fait référence à un objet - il doit simplement savoir si quoi que ce soit fait référence à un objet. Comme un modèle très grossier de ce que le GC fait, il marque chaque objet dans le tas comme de la foutaise, puis regarde les objets qu'il sait pour être non-ordures (objets "root").Par exemple, il va regarder la pile de chaque thread et pour chaque méthode d'instance dans le thread, il généralement marquer l'instance cible comme non-garbage.

Ensuite, il va passer par chacune de ces racines, et voir quels objets ceux se réfèrent à ... et les marquer comme non-ordures. Il va se rhabiller, trouver tout ce qu'il peut. Tout ce qui n'a pas été marqué comme non-déchet peut alors être collecté (ou finalisé).

Comme vous pouvez le voir à partir de cet algorithme, le GC n'a pas besoin de garder une liste complète de références pour chaque objet - juste un peu pour dire "garbage" ou "non-garbage". En réalité, le GC est beaucoup plus compliqué que cela, en Java et .NET, avec génératrice garbage collectors et diverses stratégies pour minimiser la "pause" GC et utiliser plusieurs threads pour GC. Espérons que cette vue simplifiée est suffisante pour expliquer pourquoi même le GC n'a pas de liste de références.


Pas toujours, dans le cas de .NET. Un objet peut être collecté alors qu'une méthode d'instance est encore en cours d'exécution "in", si cette méthode ne fait référence à aucun champ de l'objet à partir du point actuel.

0

Si vous ne parvenez pas à trouver la prise en charge de la langue pour cela, il suffit que chaque objet qui veut contenir une référence à l'objet en question appelle une méthode qui indique à l'objet en question qu'il est référencé. Cet objet ajouterait alors l'objet référent à une liste. Chaque fois que vous abandonnez votre référence à cet objet, vous appelez une autre méthode qui supprimerait le référent de la liste.

+1

Cela devient rapidement viral ... parce que maintenant un objet a besoin de savoir quand il va être recueilli, afin qu'il puisse se retirer. Vous finissez avec tout avoir un finaliseur, ou * masses * de code partout pour effectuer le ménage. –

+0

c'est ce que j'essaie d'éviter! ça va devenir lourd! im planing un modèle avec et expectancy pour 10000 objet avec quelques liens entre eux. si mal il suffit de garder la liste sur eux cela peut être un surcoût de 100000 à un millier de références – kalix

+0

@kalix: Ensuite, vous devez redessiner de sorte que vous n'avez pas besoin de connaître les "parents". –

Questions connexes