2010-07-08 4 views
0

Je pense que ma question peut être liée à this question here mais je vais le demander de toute façon!Question sur la collecte des ordures dans .NET

Si j'ai trois objets: A, B et C où

A Références B A Références C B références C (et vice-versa, cycliques)

sera le B> référence C cause de A ne pas être collecté quand il pourrait être collecté?

+0

Merci pour toutes vos réponses! –

Répondre

5

Les réponses à la question que vous avez liée pour bien l'expliquer. Le garbage collector est conçu pour traiter les objets qui se réfèrent les uns aux autres dans un cycle.

Si vos trois objets se réfèrent l'un à l'autre et qu'aucun autre objet ne fait référence à aucun d'entre eux, alors le cycle complet est éligible pour la collecte.

+2

Nittpick mineur: "le cycle entier * peut * être * collecté immédiatement" - c'est-à-dire qu'ils sont tous éligibles à la collecte. Il n'y a aucune garantie qu'ils seront tous rassemblés et détruits dans la même collection, surtout si l'on a un destructeur qui exige qu'il soit ressuscité. –

0

Tant que C ne fait pas référence à A, alors A sera recueilli. L'idée est, une fois que toutes les références à un objet particulier tombent hors de portée ou sont annulées/éliminées, le GC entre en jeu. Ainsi, bien que A référence C, si l'inverse n'est pas vrai, alors C n'a aucun moyen de tenir un A.

Modifier: Bien que je viens de lire que vous avez dit qu'ils se réfèrent aussi mutuellement vice-versa. Dans ce cas, il ne sera pas GCed, comme d'autres mentionnés ici.

0

Le CP recueillera tout objet qui n'est pas référencé par un objet racine. Les objets racine sont généralement des objets référencés par tous les domaines d'application (assemblés chargés/objets de type), références d'objets globaux et statiques, toutes les références d'objet sur la pile respective de chaque thread plus toute référence d'objet actuellement chargée dans un registre CPU.

Au moment de la collecte, le CPG parcourt les références de tous les objets racine connus et marque tout objet qu'il trouve sur le chemin comme étant «en cours d'utilisation». Une fois terminé, tous les objets non marqués peuvent être collectés en toute sécurité.

Ainsi, si aucun de vos objets n'est référencé (directement ou indirectement) par un objet racine, cela n'a pas d'importance s'il existe des références cycliques. Ils seront tous admissibles à la collecte indépendamment. Je dis éligible, car le GC utilise trois stratégies différentes pour collecter des objets éligibles, et pour des raisons de performances, seul l'un d'entre eux recueille tous les objets éligibles lors de l'exécution.

Normalement, vous n'aurez pas à penser à cela, ça marche. Mais il y a beaucoup plus à faire dans la collecte des ordures et vous devez en comprendre les bases afin de comprendre la gestion de la mémoire et écrire du code sans bug qui ne fuit pas les ressources. C'est pourquoi chaque développeur .NET devrait y jeter un coup d'œil. Voici quelques ressources qui expliquent plus sur la façon dont le CLR effectue la récupération de place.

MSDN - Garbage Collector Basics and Performance Hints (Rico Mariani)

MSDN Magazine - Garbage Collection (Part 1): Automatic Memory Management in the Microsoft .NET Framework (Jeffrey Richter)

MSDN Magazine - Garbage Collection (Part 2): Automatic Memory Management in the Microsoft .NET Framework (Jeffrey Richter)

Questions connexes