Различие между фоном и параллельной сборкой "мусора"?

Я считал, что с Платформой.NET 4 текущая реализация сборки "мусора" заменяется:

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

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

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

27
задан Drake 6 April 2010 в 08:57
поделиться

2 ответа

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

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

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

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

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

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

81
ответ дан 28 November 2019 в 04:12
поделиться

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

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

1
ответ дан 28 November 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: