Отладка огромной утечки памяти в приложении - PullRequest
2 голосов
/ 11 января 2010

Мое приложение только что утекло 1,5 ГБ памяти. Я полагаю, поскольку у меня нет тонны доступных мне данных, я предполагаю, что они вытекли из памяти, но они также могут просто удерживать их.

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

  1. Первое, что я могу сказать, это то, что я не реализую IDisposable ни в одном из моих классов. Однако я знаю, что не вызываю Dispose ни на одном из элементов графического интерфейса, например SolidColorBrush. Поскольку мое приложение никоим образом не интенсивно использует графику, я считаю, что это не может быть причиной проблемы. Тем не менее, я добавлю необходимые звонки.

  2. Я не знаю, использую ли я какие-либо другие классы в рамках, которые реализуют IDisposable. Я прочитал пост здесь на SO о FxCop. Я установил и использовал его для анализа моей сборки, но, похоже, он проверяет только правильную реализацию IDisposable моих собственных классов. Есть ли другой инструмент, который может сказать мне ВСЕ классы, которые реализуют IDisposable?

  3. В настоящее время я использую WF в своем приложении, и WF постоянно запускаются и заканчиваются. Perfmon показывает, что WF заканчиваются правильно, и я использую ключевое слово «using», которое, как я понимаю, относится к правильной утилизации для меня.

  4. Есть ли простой способ определить, произошла ли утечка памяти из неуправляемого или управляемого кода?

  5. В то время, когда я получил исключение OOM, приложение использовало маркеры 77k +.

Буду очень признателен за любые советы о том, как действовать дальше. Я планирую снова запустить приложение, отслеживать счетчики производительности и, возможно, отключить определенные вызовы. Я также могу запустить симуляцию для сравнения, так как в этом режиме она не будет вызывать мою C DLL.

Ответы [ 5 ]

4 голосов
/ 11 января 2010
2 голосов
/ 11 января 2010

Прежде чем идти и вкладывать средства в инструменты, вы должны попытаться выяснить, что протекает ...

Вы уже подключили perfmon, и это здорово. Я бы отслеживал следующие перфконтеры.

Процесс \ PrivateBytes обрабатывать \ обрабатывать счет Процесс \ NonPagedPool

.NET CLR Memory *

Если ваши личные байты растут, а также .NET CLR Memory \ BytesInAllHeaps, это указывает на управляемую утечку. СЛЕДУЮЩИЕ ШАГИ: Сделайте дамп процесса и проанализируйте его с помощью CLR Profiler или, альтернативно, присоедините к процессу windbg.exe, загрузите расширение sos dll и проанализируйте управляемую кучу на наличие утечек.

Если частные байты растут без соответствующего увеличения счетчиков памяти .NET CLR *, то это указывает на неуправляемую утечку. Вам нужно будет присоединить windbg.exe к процессу и использовать расширение! Heap для проверки кучи процесса.

Если вы видите монотонно увеличивающийся HandleCount, а также NonPagedPool, то у вас есть утечка дескриптора - это может быть в управляемом коде или нативном коде. Вам нужно выяснить, какие дескрипторы протекают - вы можете использовать processmon.exe из sysinternals, чтобы получить список дескрипторов, и продолжить расследование.

Надеюсь, это поможет.

2 голосов
/ 11 января 2010

Red-Gate имеет профилировщик памяти (http://www.red -gate.com / products / ants_memory_profiler / index.htm ), который чрезвычайно полезен для такого рода вещей. Я очень рекомендую это. 30 дневная пробная версия.

Randy

0 голосов
/ 12 января 2010

Непосредственно не отвечая на ваш вопрос, но я всегда использую Process Explorer , который показывает виртуальный размер процесса, рабочий набор, коллекции 0,1 и 2 поколения и частные байты (связанные с неуправляемой памятью). По сути, это просто хороший интерфейс для обычного диспетчера задач Windows и счетчиков производительности. Может помочь вам наблюдать за поведением вашего приложения, связанным с памятью.

0 голосов
/ 11 января 2010

Используйте CLR Profiler , чтобы выяснить, что вы пропускаете. Тогда исправь это.

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