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