Здесь 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.
хорошее объяснение .. однако было бы более уместным, если бы вы придерживались основной терминологии. управляемые потоки/код и т. д. Аппликативные? что это? –
Прикладные потоки - это потоки, которые запускают код, который записывает программист (в отличие от скрытых потоков управления, если они есть). «Управляемые» потоки - это потоки, которые управляют управляемым кодом (т. Е. Не кодом, написанным на C или C++). Эта основная терминология. –