Есть ли способ узнать, кто содержит ссылку на объект? - PullRequest
2 голосов
/ 19 мая 2009

Есть ли способ узнать, кто содержит ссылку на объект?

Я вижу, что d'tor не завершил мой объект после того, как я вызвал GC.Collect.

Ответы [ 3 ]

4 голосов
/ 19 мая 2009

Нет эффективного способа сделать это в коде. Лучший способ отследить утечки такого рода - использовать такой инструмент, как WinDbg. Расширение SOS имеет несколько команд, специально разработанных для отслеживания утечек памяти.

Рико сделал полную запись в блоге на эту тему:

2 голосов
/ 19 мая 2009

В дополнение к Windbg вы можете использовать .net profiler. Я сделал это обоими способами - профиль не скажет вам ничего, чего не может Windbg, но хороший профилировщик немного более дружелюбен.

Windbg В дополнение к ссылке от JaredPar у Тесс Феррандез есть несколько замечательных статей об использовании Windbg с .net. Вот статья об утечке памяти: http://blogs.msdn.com/tess/archive/2006/01/23/516139.aspx

Profiler: Мне очень повезло с профилировщиком SciTech (я никак не связан, отличный инструмент): http://memprofiler.com/

У них также есть несколько отличных видео с инструкциями.

2 голосов
/ 19 мая 2009

Вы должны позвонить GC.WaitForPendingFinalizers после GC.Collect, чтобы разрешить сборщику мусора очистить свободную очередь. Поскольку GC работает в другом потоке, возможно, что ваше приложение перешло в то время, когда GC пытается завершить любые объекты, требующие завершения. Вызывая GC.WaitForPendingFinalizers, вы заставляете текущий поток ждать, пока GC завершит очистку свободной очереди (очереди элементов, требующих завершения), прежде чем возобновить выполнение.

При этом, однако, я согласен с комментарием Джоэла Кохорна - GC работает лучше всего, когда вы оставляете его в покое.

...