Разница между фоном и одновременной сборкой мусора? - PullRequest
27 голосов
/ 06 апреля 2010

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

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

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

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

Ответы [ 3 ]

80 голосов
/ 06 апреля 2010

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

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

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

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

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

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

8 голосов
/ 28 ноября 2012

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

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

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

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

1 голос
/ 06 апреля 2010

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

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

...