Ответ 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.