Могу ли я запустить сборку мусора .NET из WinDbg?

Я изучаю, почему управляемый процесс использует много памяти. Есть ли способ запустить GC.Collect(3) из WinDbg, чтобы я мог сосредоточиться на фактическом распределении памяти?

Ответы

Ответ 1

Я не думаю, что есть какой-либо способ запустить сборку мусора .NET из WinDbg, но я также не думаю, что это необходимо.

См. Rico Mariani Performance Tidbits - отслеживание утечек управляемой памяти (как найти утечку GC) для получения информации о том, какие материал находится на вашей куче.

Дополнительные полезные ссылки:

Ответ 2

Я не верю, что вы можете вызвать GC из WinDbg.

Вот некоторые полезные инструменты, на которые я пришел, чтобы полагаться на отслеживание распределения памяти:

  • SOSEX - дальнейшее расширение для WinDbg для дополнения SOS, который добавляет! dumpgen, чтобы сбрасывать объекты из конкретное поколение (отлично подходит для выясняя, что находится на LOH и в Gen 2) и команда! refs который предоставит родительские ссылки для объект.
  • . Чистая память Профайлер - это очень полезный инструмент при работе интерактивно, но также содержит возможность загрузки из файла дампа. Это дает достаточно интуитивно понятный способ отслеживать использование памяти. Легко стоит 250USD цена, но у них также есть 14-дневный прогноз.

Ответ 3

WinDBG - это, прежде всего, Win32/Kernel Debugger. Поэтому вы можете попробовать один из управляемых отладчиков, например mDBG. Но я использовал .NET Debugging для MSFT, и мне никогда не понадобилось ничего подобного для устранения утечек памяти.

Ответ 4

Привет, Роджер. Надеюсь, утечка памяти уже решена.: -)

Сначала я был уверен, что это "управляемая утечка памяти". Под этим я подразумеваю, что при просмотре счетчиков Performance Monitor . CLR-память .NET → # Bytes во всех кучах увеличивается с той же скоростью, что и Процесс → Частные байты счетчик для того же процесса. Если да, то вы можете использовать описанные выше методы.

Если это не так, у вас может быть утечка, вызванная запуском управляемого кода. Наиболее распространенный, который я вижу, связан с сборками .NET, которые загружаются в процесс и не выгружаются. Это похоже на утечку памяти в Perfmon.

Я предлагаю вам попробовать запустить правило утечки в DebugDiag и посмотреть, что показывает отчет о памяти как протекающие вызовы.

Вот еще один отличный ресурс по теме: У меня утечка памяти!!! Что я делаю? (определение "where" )

Спасибо, Аарон