Необычные паттерны сбора мусора

В .net 4.0 я наблюдаю некоторые необычные паттерны сбора мусора, которые я не могу объяснить, любой совет будет принят с благодарностью.

В различные моменты выполнения моей программы количество сборок G2 начинает увеличиваться, а время GC % доходит почти до 100%. Это продолжается в течение некоторого времени, прежде чем остановиться (пожалуйста, смотрите снимок экрана Performance Monitor ниже). В это время трассировка событий CLR GC ETW в PerfView показывает, что несколько длительных G2 коллекций запускаются одна за другой с причиной 'AllocSmall'.

Может ли кто-нибудь пролить свет на:

  1. Что именно вызывает событие 'AllocSmall'
  2. Почему эти события непосредственно вызывают сбор G2
  3. Почему эти сбор G2 происходят один за другим

Низкий уровень памяти не является проблемой, поскольку события запуска GC не содержат этого кода причины (http://msdn.microsoft.com/en-us/library/ff356162.aspx). Мы также наблюдали похожие ситуации, когда коллекции G0 происходили одна за другой.

Edit: Было высказано предположение, что триггером может быть превышение некоторого порога. Учитывая, что все еще есть свободная память, я бы ожидал, что куча G2 расширится в этот момент, а не будет пытаться собрать GC.

Edit: Изображения, размещенные ниже, имеют гораздо большее разрешение, чем отображает StackOverflow - просто откройте ссылку на изображение прямо во вкладке браузера.

Performance Monitor TracePerfView Event Trace

10
задан Simon Walker 8 February 2012 в 17:53
поделиться