Шаги, чтобы выяснить, какие управляемые типы вызывают утечку, можно суммировать следующим образом:
- Запустите WinDbg и присоедините ваш процесс
- Загрузите расширение отладчика SOS в WinDbgиспользуя:
.loadby sos mscorwks
(замените mscorwks
на clr
, когда ваше приложение работает на v4.0) - Сбросьте статистику использования памяти с помощью
!dumpheap -stat
- Найдите типы утечек (согласнона их использование памяти и количество экземпляров)
- Найдя тип утечки, сбросьте его экземпляры, используя
!dumpheap -mt <INSTANCE METHODTABLE>
(methodTable может быть получен из выходных данных предыдущей команды) - Выберите случайное числоэкземпляры и посмотрите, почему они не выпущены коллекциями GC (в которых корни gc по-прежнему сохраняют ссылку на них), используя
!gcroot <INSTANCE ADDRESS>
На данный момент у вас должно быть достаточно данных, чтобы найти источник вашегоутечка.
Более подробную статью об этих шагах можно найти здесь .