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