2010-04-06 3 views
27

я прочитал, что с .NET Framework 4 заменяется текущая реализация мусора:Разница между фоном и одновременной сборкой мусора?

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

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

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

ответ

75

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

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

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

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

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

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

+0

хорошее объяснение .. однако было бы более уместным, если бы вы придерживались основной терминологии. управляемые потоки/код и т. д. Аппликативные? что это? –

+8

Прикладные потоки - это потоки, которые запускают код, который записывает программист (в отличие от скрытых потоков управления, если они есть). «Управляемые» потоки - это потоки, которые управляют управляемым кодом (т. Е. Не кодом, написанным на C или C++). Эта основная терминология. –

1

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

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

8

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

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

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

От Tess da Man! http://blogs.msdn.com/b/tess/archive/2009/05/29/background-garbage-collection-in-clr-4-0.aspx

Смежные вопросы