Подтвердить что ты не робот

Разница между фоновым и одновременным сбором мусора?

Я прочитал, что с .NET Framework 4 текущая сборка мусора заменяется:

.NET Framework 4 обеспечивает фоновая сборка мусора. Эта функция заменяет одновременный мусор сбор в предыдущих версиях и обеспечивает лучшую производительность.

В на этой странице есть объяснение, как это работает, но я не уверен, что понял.

В практическом мировом приложении, какова польза от этой новой реализации GC? Является ли это функцией, которая может быть использована для перехода от 3,5 или до 4,0?

4b9b3361

Ответ 1

Здесь Microsoft использует имена "concurrent" и "background" для описания двух версий GC, которые он использует в .NET. В мире .NET "сборщик фона" является улучшением над "параллельным сборщиком", поскольку он имеет меньше ограничений на то, что приложения могут выполнять во время работы коллектора.

Базовый GC использует стратегию "stop-the-world": прикладные потоки выделяют блоки памяти из общей кучи. Когда GC должен работать (например, было выделено слишком много блоков, требуется некоторая очистка), все прикладные (управляемые) потоки прекращаются. Последний поток останавливает GC и разблокирует все остальные потоки, когда он закончил. Протокол Stop-the-world GC прост в реализации, но вызывает паузы, которые могут быть заметны на уровне пользователя.

Microsoft "параллельный GC" является поколением: он использует стратегию "стоп-мир" только для ограниченной части кучи (что они называют "поколениями 0 и 1" ). Поскольку эта часть остается небольшой, паузы остаются короткими (например, ниже 50 мс), так что пользователь их не заметит. Остальная часть кучи собирается с помощью выделенного потока GC, который может работать одновременно с аппликативными нитями (отсюда и название).

Параллельный GC имеет некоторые ограничения. А именно, бывают моменты, когда поток GC должен принимать несколько исключительный контроль над кучей. В такие моменты прикладные потоки могут выделять блоки только из небольших областей, специфичных для потока. Нити, которые имеют большие потребности, скоро наткнутся на основную кучу, которая в это время блокируется резьбой GC. Затем выделяющий поток должен блокироваться до тех пор, пока поток GC не завершит свою фазу блокировки. Это снова вызывает паузы. Меньше пауз, чем при использовании GC-диска Stop-the-world, и эти паузы не влияют на все потоки. Тем не менее, паузы остаются.

"Фоновый GC" - это расширенный GC, в котором поток GC не должен блокировать кучу. Это устраняет дополнительные паузы, описанные в предыдущем абзаце; остаются только ограниченные паузы, когда собираются молодые поколения (что Microsoft называет "коллекцией переднего плана" ).

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

Ответ 2

Вот объяснение реального мира без излишнего и чрезмерного чувства самооценки:

В параллельном GC вам было разрешено выделять в GC, но вы not разрешено запускать другой GC в GC. Это, в свою очередь, означает, что максимум, который вы можете выделить в GC, - это любое пространство, в котором у вас есть слева на одном сегменте (в настоящее время 16 МБ в режиме рабочей станции) минус все, что уже выделено там).

Разница в фоновом режиме заключается в том, что вам разрешено запускать новый GC (gen 0 + 1), а в полноэкранном GC, и этот позволяет вам даже создать новый сегмент, если необходимо. Короче говоря, блокировка, которая могла произойти до того, когда вы выделили все, что вы могли бы в одном сегменте, больше не будет.

От Тесс-да-Ман! http://blogs.msdn.com/b/tess/archive/2009/05/29/background-garbage-collection-in-clr-4-0.aspx

Ответ 3

Основным преимуществом будет меньшее количество замораживания приложений из-за сбора мусора, что само по себе можно считать существенным улучшением. Для большинства приложений эта разница не будет заметна, если у вас нет ОГРОМНОГО количества долгоживущих объектов в памяти.

Это изменение также делает .NET немного более жизнеспособным для создания приложений, чувствительных к времени (где время ответа важно). Крайним примером являются автомобильные подушки безопасности - вы не хотите, чтобы ваше программное обеспечение было занято, делая сборку мусора, когда их нужно раздувать. Изменения в 4.0 уменьшают количество и длину зависаний из-за GCing, но не полностью удаляют их.