2009-05-19 6 views
2

Y a-t-il un moyen de savoir qui détient une référence à un objet?Y a-t-il un moyen de savoir qui détient une référence à un objet?

Je vois que mon objet n'est pas finalisé par le d'or après que j'appelle GC.Collect.

+1

Pourquoi appelez-vous GC.Collect? Ne vous souciez pas de nettoyer la mémoire, et pour les ressources autres que la mémoire, vous devez implémenter IDisposable et les éliminer. –

+0

J'ai jeté une réponse ci-dessous, mais je suppose que vous appelez GC.Collect() à des fins de débogage. Au-delà de ça, je suis d'accord avec Joel - que le GC s'inquiète du moment de la collecte. Vous pouvez provoquer plus de problèmes que vous ne parvenez à l'appeler manuellement. – JMarsch

+0

Correct. J'appelle GC.Collect() juste pour le débogage. Je veux m'assurer que mon objet est finalisé. – reshefm

Répondre

4

Il n'y a aucun moyen de le faire efficacement dans le code. La meilleure façon de localiser les fuites de ce type est d'utiliser un outil comme WinDbg. L'extension SOS a plusieurs commandes qui sont spécifiquement conçues pour aider à localiser les fuites de mémoire.

Rico a fait une entrée de blog complet sur le sujet:

2

Vous devez appeler GC.WaitForPendingFinalizers après GC.Collect pour permettre au collecteur d'ordures pour effacer la file d'attente freachable. Puisque le GC fonctionne dans un thread différent, il est possible que votre application soit passée alors que le GC essaye de finaliser tous les objets qui nécessitent une finalisation. En appelant GC.WaitForPendingFinalizers, vous forcez votre thread actuel à attendre que le GC ait terminé de vider la file d'attente extensible (la file d'attente des éléments à finaliser) avant de reprendre l'exécution. Ceci dit, je suis d'accord avec le commentaire de Joel Coehoorn - le GC fonctionne mieux quand on le laisse seul.

2

Outre Windbg, vous pouvez utiliser un profileur .net. Je l'ai fait dans les deux sens - le profil ne vous dira rien que Windbg ne peut pas, mais un bon profileur est un peu plus amical. En plus du lien de JaredPar, Tess Ferrandez a d'excellents articles sur l'utilisation de Windbg avec .net. Voici aa article de fuite de mémoire: http://blogs.msdn.com/tess/archive/2006/01/23/516139.aspx

Profiler: J'ai eu beaucoup de chance avec le profileur de SciTech (je ne suis pas affilié en aucune façon, outil, cependant): http://memprofiler.com/

Ils ont un grand comment- aux vidéos sur leur site aussi.

Questions connexes