Есть ли способ, что я могу знать, кто хранит ссылку на объект?
Я вижу, что мой объект не доработан d'тор после того как я называю GC.Collect.
Есть ли способ, что я могу знать, кто хранит ссылку на объект?
Я вижу, что мой объект не доработан d'тор после того как я называю GC.Collect.
Там нет никакого способа сделать это эффективно в коде. Лучший способ отслеживать утечки такого рода является использование такого инструмента, как WinDbg. Расширение SOS имеет несколько команд, которые специально разработаны, чтобы помочь отследить утечку памяти.
Рико сделал запись тщательного блога на эту тему:
Вы должны позвонить GC.WaitForPendingFinalizers
после того, как GC.Collect
разрешить сборщик мусора , чтобы очистить freachable очередь. Поскольку GC работает в другом потоке, возможно , что ваше приложение переместилось на то время GC пытается завершить какие - либо предметы , которые требуют доработок. Позвонив GC.WaitForPendingFinalizers
вы заставляете текущий поток ждать , пока ГХ не закончит очистки freachable очереди (очереди элементов , которые требуют доработки) , прежде чем возобновить выполнение.
Это, как говорится, однако, я согласен с комментарием Joel Coehoorn в - ГХ работает лучше всего, когда вы оставить его в покое.
В дополнение к Windbg, вы могли бы использовать .net профилировщика. Я сделал это оба пути - профиль не скажет ничего, что Windbg не может, но хороший профайлер немного более дружественными.
Windbg В дополнение к ссылке с JaredPar, Тесс Ferrandez имеет некоторые большие статьи об использовании Windbg с .net. Вот аа статья утечки памяти: http://blogs.msdn.com/tess/archive/2006/01/23/516139.aspx
Profiler: У меня было большой удачи с профилировщика SCITECH в (я не связан каким - либо образом, отличный инструмент, хотя): http://memprofiler.com/
У них есть некоторые большие, как сделать видео на их сайте, а также.