Если я не ошибаюсь, похоже, ваш товарищ по команде уже использует WinDbg с управляемым расширением (может быть, SOS?) И вызвал ! Dumpheap -stat .Получить копию его файла дампа памяти, открыть его в WinDbg и загрузить SOS.
Первым шагом является детализация до определенных типов.В вашем случае, похоже, у вас необычно большое выделение для строк (около 84 МБ).Поэтому попробуйте просмотреть список строк, выполнив:
!dumpheap -type System.String
Он выведет длинный список экземпляров строк.Вывод будет выглядеть примерно так:
Address MT Size Gen
0x412d0030 0x79b94638 812 1 System.String XXXX
0x422d0030 0x79b94638 812 1 System.String XXXX
0x432d0030 0x79b94638 812 1 System.String XXXX
Эта команда, вероятно, будет выполняться в течение нескольких минут, поскольку у вас много строковых экземпляров, но вы пытаетесь наблюдать за выводом во время его работы.Если вы заметили, что многие экземпляры имеют одинаковый размер, это, как правило, хороший знак того, что вы неправильно высвобождаете свои ресурсы.Любой из этих примеров является хорошим кандидатом на следующий шаг.Если в конце списка вы также видите строки большого размера, это также хорошие кандидаты для следующего шага.
Следующим шагом является проверка того, какие объекты ссылаются на конкретный экземпляр строки и препятствует этому.от мусора.Вы можете сделать это, используя адрес из вывода dumpheap выше и затем позвонив:
!gcroot 0x432d0030
Это выведет что-то вроде этого:
173866dc(System.Web.UI.WebControls.ListItemCollection)->
173866ec(System.Collections.ArrayList)->
173894b8(System.Object[])->
17386d0c(System.Web.UI.WebControls.ListItem)->
17386ce8(System.String)
Вы можетепрочитайте это снизу вверх.Таким образом, в этом примере String содержится в ListItem , который, в свою очередь, содержится в массиве Objects .На этом этапе решение вашей проблемы становится больше искусством.Начните с нижней части этой цепочки (включая String ) и для каждой восходящей строки проверяйте, можете ли вы оправдать сохранение этого объекта в памяти.Если нет, то вы должны найти способ освободить этот ресурс и собрать его.Этот шаг, скорее всего, потребует от вас просмотра и анализа кода для каждого класса.
Совет: Поскольку у вас также есть необычно большое количество экземпляров для System.Action, есть большая вероятность, что вы подписаны наделегат события / многоадресной рассылки, после чего вы забыли отписаться.