Могу ли я запустить сборку мусора .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" )
Спасибо,
Аарон