C # утечка памяти ??Gen 0 и 1 постоянно растет в perfmon - Что это значит? - PullRequest
2 голосов
/ 09 ноября 2011

Я использую C # 2.0 для многопоточного приложения, которое получает не менее тысячи обратных вызовов в секунду от неуправляемой dll и периодически отправляет сообщения из сокета. GUI остается в основном потоке.

Мое приложение в основном создает объект при запуске и периодически во время выполнения в течение короткого периода времени.

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

Я запустил perfmon и вот мои наблюдения ...

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

Размер кучи Gen1 всегда в рулоне. Вверх и вниз

Размер кучи Gen2 следует за циклом. Оно продолжает расти, пока на некоторое время не станет плоским, а затем падает.

Коллекции 0 и 1 поколения постоянно растут в диапазоне от 1 до 5 единиц. Коллекции Gen 2 постоянны.

Ответы [ 3 ]

1 голос
/ 11 ноября 2011

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

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

RedGate Ants Memory Profiler

SciTech .NET Memory Profiler

EQATEC .NET Profiler

CLR Profiler (бесплатно)

0 голосов
/ 11 ноября 2011

Я помню, как читал пост в блоге о производительности памяти в .NET (в частности, XNA на XBox 360) некоторое время назад (к сожалению, я не могу найти упомянутую ссылку больше).

В основе достижения производительности памяти с низкой задержкой было то, что вы никогда не запускаете GC 2-го поколения в критически важные для производительности моменты времени (хотя нормально запускать их, когда задержка не важна; существует множество обратных вызовов для уведомлений).функционирует в классе GC в более поздних версиях фреймворка, что может помочь в этом).Есть два способа убедиться, что это произойдет:

  1. Не выделяйте ничего , которое уходит в поколение 2. Для объектов тревожно легко убежать в поколение 2, когда вы неЯ не осознаю этого, поэтому это часто приводит к следующему: не выделяйте ничего в критичном для производительности коде.Поскольку никакие объекты не попадают в поколение 2, сборщик мусора не должен собирать.
  2. Выделите все необходимое заранее и используйте пул объектов .Ваша куча второго поколения будет большой, но поскольку к ней ничего не добавляется, сборщик мусора не должен ее собирать.

Может быть полезно заглянуть в некоторые статьи о производительности, связанные с XNA или Silverlight, посколькуигры и устройства с ограниченными ресурсами часто очень чувствительны к задержкам.(Обратите внимание, что это легко, потому что XBox 360 и, до Манго, Windows Phone имели только одно поколение GC (сборщик меток и разверток)).

0 голосов
/ 11 ноября 2011

Таким образом, как говорит @Jalf, нет никаких признаков утечки памяти как таковой: то, что вы обсуждаете, ближе к задержке, вызванной сборкой мусора.

Другие могут не согласиться, но я бы предположил, что все, что превышает несколько сотен обратных вызовов в секунду, растягивает язык общего назначения, такой как C #, особенно тот, который управляет памятью от вашего имени. Таким образом, вам нужно научиться распределять память и помогать среде выполнения.

Сначала получим настоящий профилировщик . Perfmon имеет свое применение, но даже профилировщик в более поздних версиях Visual Studio может дать вам много дополнительной информации. Мне больше всего нравится профилировщик SciTech (http://memprofiler.com/);, есть другие, в том числе и уважаемый RedGate, рассмотренный здесь: http://devlicio.us/blogs/scott_seely/archive/2009/08/23/review-of-ants-memory-profiler.aspx

Как только вы узнаете свой базовый уровень, стремится уничтожить коллекции gen2 . Они будут действительно медленными. Работайте усердно в любых узких циклах, чтобы исключить как можно больше выделения памяти - обычные нарушители - строки.

Некоторые полезные советы содержатся в старой, но все еще актуальной статье MSDN: http://msdn.microsoft.com/en-us/library/ms973837.aspx.

Также полезно прочитать (выдающуюся) серию блогов Тесс Феррандез по отладке приложений ASP.NET - забронируйте день вне офиса и начните здесь: http://blogs.msdn.com/b/tess/archive/2008/02/04/net-debugging-demos-information-and-setup-instructions.aspx.

...