C # - Метод программно пытается проверить утечку памяти в блоке кода - PullRequest
6 голосов
/ 10 июня 2011

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

Подход, который первым приходит на ум, выглядит примерно так:

  • Подождите, пока запустится GC.
  • Получить текущую выделенную память от ГХ.
  • [Выполнить блок управляемого кода.]
  • Подождите, пока запустится GC.
  • Получить текущую выделенную память из ГХ и вычесть из выделенной памяти, записанной перед запуском блока кода. Верно ли, что теоретически разница должна быть (около) 0, если все объекты, размещенные в блоке кода, который был выполнен, были разыменованы соответствующим образом и собраны?

Конечно, непосредственная проблема в этом заключается в том, что там, скорее всего, будут ждать ... и ждать ... и ждать запуска недетерминированного GC. Если мы пропустим этот аспект, вычисление для определения того, утек ли блок кода какую-либо память, однако может сильно отличаться и не обязательно будет точным, поскольку некоторые элементы, возможно, не были собраны в то время.

Вышеупомянутое кажется мне лучшим вариантом, когда я пытаюсь определить, достаточно ли точно блок памяти имеет утечку памяти? Или есть другие методы работы, которые используются в реальной жизни? Спасибо.

Ответы [ 3 ]

6 голосов
/ 10 июня 2011

Лично я бы никогда не осмелился самостоятельно выполнять профилирование памяти.Я буду бояться, что у меня либо нет полных знаний, и что для этого потребуется бесконечное время.

Вместо этого я успешно использовал профилировщики памяти, такие как ANTS-накопитель памяти Red Gate .

1 голос
/ 10 июня 2011

Хотя использование ANTS Profiler является потрясающим, оно не поможет, если ваша проблема видна только в производстве.

У Тесс Феррандез есть серия Labs , которые демонстрируюткак отлаживать производственные проблемы, в том числе утечки памяти.Они ориентированы на ASP.NET, но могут использоваться и для других типов приложений.

0 голосов
/ 10 июня 2011

Вам действительно нужен Профилировщик памяти, как этот : С этим вы можете:

  • запустите ваше приложение, сделайте снимок памяти (вручную или из вашего кода)
  • [Выполнить блок управляемого кода]
  • сделать еще один снимок памяти
  • сравните два снимка и посмотрите, какие новые объекты теперь находятся в управляемой куче

Я считаю, что это именно то, что вы хотите сделать, только гораздо менее болезненно. Он также имеет несколько полезных фильтров, таких как «показывать объекты, которые делегаты поддерживают в живых». Он также может анализировать дампы памяти из производственной системы.

...