Поделиться через


DA0022: Высокая доля сборок мусора в генерации 2

Идентификатор правила

DA0022

Категория

Использование .NET Framework

Метод профилирования

Все

Сообщение

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

Тип правила

Предупреждение

При профилировании методом выборки, памяти .NET или конфликтов ресурсов необходимо собрать не меньше 10 экземпляров, чтобы вызвать срабатывание правила.

Причина

Данные о производительности системы, собранные в ходе сеанса профилирования, свидетельствуют о том, что во 2-м поколении сборки мусора было очищено значительно больше памяти, используемой для объектов .NET Framework, чем при сборке мусора 0-го и 1-го поколения.

Описание правила

Среда CLR Microsoft .NET обеспечивает автоматический механизм управления памятью, который использует сборщик мусора для удаления из памяти объектов, более не используемых приложением.Работа сборщика мусора основана на понятии поколений и предположении о краткосрочном характере выделения памяти.Например, время существования локальных переменных должно быть небольшим.Поколение новых объектов начинается с 0 (поколение 0), затем они переходят в поколение 1, если они сохраняются после сборки мусора, и, наконец, в поколение 2, если они все еще используются приложением.

Объекты поколения 0 собираются часто и обычно очень эффективно.Объекты поколения 1 собираются менее часто и менее эффективно.Наконец, сбор объектов с большим временем существования из поколения 2 должен происходить еще реже.Сборка поколения 2, т. е. полная сборка мусора, также является наиболее ресурсоемкой операцией.

Это правило применяется при слишком большом относительном числе операций сборок мусора поколения 2.У корректно работающих приложений .NET Framework число сборок поколения 1 будет в 5 раз превышать число сборок поколения 2.(Идеальным, по-видимому, является множитель 10x.)

Анализ предупреждения

Дважды щелкните сообщение в окне "Список ошибок", чтобы перейти к представлению Представление меток данных профилирования.Найдите столбцы Память CLR .NET\Сборок мусора для поколения 0 и Память CLR .NET\Сборок мусора для поколения 1.Установите, есть ли какие-либо этапы выполнения программы, на которых сборка мусора происходит чаще, чем на других этапах.Сравните эти значения со значениями в столбце % времени сборки мусора, чтобы определить, приводит ли структура выделений управляемой памяти к чрезмерным дополнительным затратам на управление памятью.

Большое относительное число сборок поколения 2 не всегда свидетельствует о проблеме.Иногда такое поведение предусматривается конструктивно.Активировать это правило может приложение, выделяющее большие структуры данных, которые должны оставаться активными длительное время в процессе выполнения.Если такое приложение испытывает нехватку памяти, ему приходится чаще выполнять сборку мусора.Если менее затратные сборки мусора поколения 0 и поколения 1 могут освободить только незначительное количество управляемой памяти, сборка мусора поколения 2 будет планироваться с большей частотой.

В представлении "Метки" предусмотрены дополнительные столбцы "Память CLR .NET", которые могут помочь в выявлении проблем сборки мусора.Столбец % времени сборки мусора помогает определить объемы дополнительных затрат на управление памятью.Если в приложении используется весьма незначительное число больших, но постоянных объектов, частая сборка поколения 2 не должна занимать слишком много времени ЦП.Если приложению не хватает памяти из-за потребности в дополнительной физической памяти (ОЗУ), могут также применяться связанные правила, в которых оцениваются значения в столбце Память\Страниц в секунду.

Чтобы понять схему использования управляемой памяти в приложении, выполните его повторное профилирование, запустив профиль выделения памяти .NET, и выберите параметр профилирования "Время жизни объекта".

Дополнительные сведения о повышении производительности сборки мусора см. в разделе Garbage Collector Basics and Performance Hints на веб-сайте Майкрософт.Дополнительные сведения о дополнительных затратах на автоматическую сборку мусора см. в статье Представляем кучу для массивных объектов.