DA0021. Высокая доля сборок мусора в генерации 1
Идентификатор правила |
DA0021 |
Категория |
Использование .NET Framework |
Методы профилирования |
Все |
Сообщение |
Наблюдается довольно большое число операций сборок мусора поколения 1. Если конструктивно предусмотрено, что большинство структур данных программы выделяются и сохраняются длительное время, в этой проблеме нет ничего необычного. Однако если такое поведение ненамеренное, возможно, приложение закрепляет объекты. В случае сомнений, чтобы разобраться с используемой в приложении схемой выделения памяти .NET, можно собрать данные о выделении памяти .NET и данные о времени существования объектов. |
Тип правила |
Сведения |
При профилировании методом выборки, памяти .NET или конфликтов ресурсов необходимо собрать не меньше 10 экземпляров, чтобы вызвать срабатывание правила.
Причина
Данные о производительности системы, собранные в ходе сеанса профилирования, свидетельствуют о том, что в 1-м поколении сборки мусора было очищено значительно больше памяти, используемой для объектов .NET Framework, чем при сборе данных 0-го поколения.
Описание правила
Среда CLR Microsoft .NET обеспечивает автоматический механизм управления памятью, который использует сборщик мусора для удаления из памяти объектов, более не используемых приложением. Работа сборщика мусора основана на понятии поколений и предположении о краткосрочном характере выделения памяти. Например, время существования локальных переменных должно быть небольшим. Поколение новых объектов начинается с 0 (поколение 0), затем они переходят в поколение 1, если они сохраняются после сборки мусора, и, наконец, в поколение 2, если они все еще используются приложением.
Объекты поколения 0 собираются часто и обычно очень эффективно. Объекты поколения 1 собираются менее часто и менее эффективно. Наконец, сбор объектов с большим временем существования из поколения 2 должен происходить еще реже. Сборка поколения 2, т. е. полная сборка мусора, также является наиболее ресурсоемкой операцией.
Это правило применяется при слишком большом относительном количестве операций сборок мусора поколения 1. Если слишком много объектов с небольшим временем существования остаются после сборки поколения 0, однако при этом их удается собрать в процесс сборки поколения 1, затраты на управление памятью могут оказаться слишком высокими. Дополнительные сведения см. в публикации Mid-life crisis в блоге Rico Mariani's Performance Tidbits на веб-сайте MSDN.
Анализ предупреждения
Дважды щелкните сообщение в окне "Список ошибок", чтобы перейти к представлению Представление меток данных профилирования. Найдите столбцы Память CLR .NET\Сборок мусора для поколения 0 и Память CLR .NET\Сборок мусора для поколения 1. Установите, есть ли какие-либо этапы выполнения программы, на которых сборка мусора происходит чаще, чем на других этапах. Сравните эти значения со значениями в столбце % времени сборки мусора, чтобы определить, приводит ли структура выделений управляемой памяти к чрезмерным дополнительным затратам на управление памятью.
Чтобы понять схему использования управляемой памяти в приложении, выполните его повторное профилирование, запустив профиль выделения памяти .NET, и отправьте запрос на измерение времени существования объекта.
Дополнительные сведения о повышении производительности сборки мусора см. в разделе Garbage Collector Basics and Performance Hints на веб-сайте Майкрософт. Дополнительные сведения о дополнительных затратах на автоматическую сборку мусора см. в статье Представляем кучу для массивных объектов.