C # Утечка памяти, отслеживание технических средств и инструментов - PullRequest
8 голосов
/ 20 сентября 2010

Приложение, которое я пишу, очень сильно страдает от утечки памяти. Практически вся объектная модель остается в памяти, когда пользователь закрывает загруженный проект. Я знаю это потому, что закрытие проекта в моем приложении практически не влияет на использование памяти в диспетчере задач, а затем открытие нового проекта почти удваивает его каждый раз. Я скачал jetTrain Memory 3.5, но там мало (нет) инструкций по использованию. Я как бы понял, как его использовать, и это показывает, что вся объектная модель все еще находится в памяти, когда я делаю снимок после того, как проект был закрыт. Просматривая мой проект, закройте код. Я не вижу причин для этого. Кто-нибудь знает что-либо, в частности, что обычно вызывает утечки памяти в C # или какие-либо инструменты или методы для отслеживания проблемы. Хорошо, что приложение, которое показывает всю мою объектную модель, все еще загружено в память, но не показывает, какой объект или переменная хранит его. Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 20 сентября 2010

Во-первых, выясните, может ли утечка быть вызвана регистрацией обработчиков событий, так как это один из самых простых способов случайного укоренения ваших объектов. Например, если у вас есть класс «Bob», который добавляет один из своих методов «OnSomeEvent» в качестве делегата к событию, которое вызывается долгоживущим компонентом вашей системы (например, «UserSettingsManager»), тогда объекты класса «Bob» 'не будут собраны, поскольку они поддерживаются в силу того, что они являются обработчиками событий (т.е. обратные вызовы событий не являются слабыми ссылками).

В качестве альтернативы коммерческим инструментам есть отладчик Windows под названием SoS (Son of Strike), который можно использовать для отладки управляемых приложений. Тем не менее, это не слабонервный, так как это низкоуровневый инструмент командной строки, который требует много предварительных знаний. Однако он очень мощный и не так сильно борется с большими процессами (с точки зрения потребления кучи), как коммерческие инструменты.

Что касается коммерческих профилировщиков, у меня был хороший опыт использования ANG Memory Profiler от Redgate (но у меня были коллеги, которые его ненавидят), так что, возможно, стоит попробовать это.

3 голосов
/ 20 сентября 2010

Вероятно, наиболее распространенной причиной утечек управляемой памяти являются неподписанные обработчики событий.

Существует ряд полезных инструментов для отслеживания ошибок, подобных этой. Лично мне нравится ANTS Memory Profiler и WinDbg / SOS. Вы хотите узнать, что укореняет графы объектов. В WinDbg / SOS есть команда !gcroot, которая сообщит вам корни любого данного объекта.

Проверьте Блог Тесс , чтобы узнать, как решать проблемы с памятью с помощью WinDbg / SOS.

...