.net проблема утечки памяти - PullRequest
       0

.net проблема утечки памяти

2 голосов
/ 16 августа 2011

У меня есть приложение в .net, которое получает все больше и больше памяти.Я получил анализ от одного из членов команды о самых распространенных и наиболее тяжелых случаях, которые выделяет мое приложение.

enter image description here

Проблема в том, что я не знаю, что делатьследующий.Исходный код огромен!и мне нужна лучшая практика, как захватывать проблемные функции / строки кода.

ps - я пробовал использовать функцию Visual Studio «распределение памяти (выборка)», но всегда не удавалось создать отчет.(думаю, это может быть другой вопрос).

Ответы [ 3 ]

1 голос
/ 16 августа 2011

Visual Studio Profiler идеально соответствует вашим требованиям, он способен отображать горячий путь в стеке вызовов.Вы должны научиться работать с профилировщиком, поэтому, если вы не можете сгенерировать отчет о профилировщике Visual Studio и не можете исследовать, как это сделать, стоит сначала начать читать документацию, поскольку независимо от того, какие инструменты вы используете в этом случае.

Ниже приведены полезные ссылки, касающиеся профилировщика Visual Studio:

РЕДАКТИРОВАТЬ: Hot Path By VS Profiler:

enter image description here

0 голосов
/ 16 августа 2011

Если я не ошибаюсь, похоже, ваш товарищ по команде уже использует 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, есть большая вероятность, что вы подписаны наделегат события / многоадресной рассылки, после чего вы забыли отписаться.

0 голосов
/ 16 августа 2011

В первую очередь мне нравится использовать windbg с psscor2.Затем я делаю! Gcroot и / или! GCRef.Это иногда дает представление о базовых ссылках, которые поддерживают объекты в живых.

Извините за этот поспешный ответ, посмотрите, например, этот блог , чтобы получить дополнительные ссылки, если вы не знаете о psscor2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...