Что такое "в основном параллельный сборщик мусора"?
Я знаком с понятиями сборщиков мусора реального времени, инкрементных, параллельных, параллельных, (мягких / жестких) в реальном времени. Но я не могу понять в основном - одновременный сборщик мусора. Это отличается от одновременного GC? Какая разница? Почему это называется в основном?
2 ответа
Я знаком с понятиями сборщиков мусора реального времени, инкрементных, параллельных, параллельных, (мягких / жестких) в реальном времени. Но я не могу понять в основном - одновременный сборщик мусора. Это отличается от одновременного GC? Какая разница? Почему это называется в основном?
Как и многие другие предметы, сборка мусора окутана туманом терминологической неопределенности. Бем особенно печально известен тем, что использовал обычные термины нетрадиционными способами, но мы должны простить его, потому что он был пионером в области в то время, когда обычные значения еще не были окостеневшими!:-)
Насколько я понимаю, GC "останови мир" относится к алгоритму, который приостанавливает все потоки мутатора на весь период цикла GC, например, при маркировке всей кучи. Например,.NET Server GC делает это и, как следствие, получает огромные 300 мс паузы. Инкрементальные GC выполняют небольшую часть основной работы GC в каждом вспомогательном цикле GC, например, "основные срезы" в GC OCaml. Параллельно означает, что GC использует несколько потоков для ускорения процесса сбора мусора. Параллельный сборщик мусора означает, что сборщик мусора запускается одновременно с мутаторами, например рабочая станция.NET GC. Реальное время трудно определить, изначально подразумевалось ограниченное максимальное время паузы, но теперь также означает минимальное использование мутатора (MMU), чтобы избежать патологической проблемы GC, который никогда не останавливает мутатор на долгое время, никогда не позволяя ему работать! Согласно новой книге Ричарда Джонса, сборщик мусора "на лету" никогда не приостанавливает более одного мутатора за раз (то есть не существует фазы остановки мира), хотя я подозреваю, что он имел в виду, что мутаторы приостановлены независимо друг от друга. Наконец, GC в основном параллельный - это тот, который приостанавливает все потоки мутатора одновременно, но только на короткий период времени, а не на произвольно длинный цикл GC. Следовательно, мутаторам разрешено свободно работать большую часть времени, пока работает GC, и, следовательно, это называется "главным образом одновременным" GC.
Классификация "главным образом одновременных" важна, потому что большинство (все?) Основных GC попадают в эту категорию, потому что она обеспечивает хороший компромисс между временем паузы и пропускной способностью. Например, рабочая станция.NET GC приостанавливает все потоки мутатора при создании моментального снимка глобальных корней, но возобновляет их во время пометки и очистки.
Доступное описание можно найти в статье Богема, Демерса и Шенкера "Материалы по большей части параллельного сбора мусора" (Материалы конференции ACM SIGPLAN '91 по проектированию и внедрению языков программирования, SIGPLAN Notices 26, 6 (июнь 1991 г.), стр. 157-164).
Они пишут:
Предположим, мы можем поддерживать набор виртуальных грязных битов, которые автоматически устанавливаются всякий раз, когда на соответствующие страницы виртуальной памяти записываются. (Приемлемая реализация этой функции может быть получена путем защиты страниц от записи и перехвата возникающих ошибок записи без каких-либо изменений в ядре ОС; реализация в ядре ОС, конечно, будет более эффективной.) Для любого определенного сборщика трассировки для операции "останови мир" рассмотрим следующий алгоритм сбора. В начале коллекции удалите все виртуальные грязные биты. Выполните традиционную операцию трассировки параллельно с мутатором. Виртуальные грязные биты будут обновлены для отражения записи мутатора. После завершения трассировки остановите мир и отследите все отмеченные объекты, которые лежат на грязных страницах. (Регистры считаются грязными.) На этом этапе все достижимые объекты отмечены, и мусор можно безопасно утилизировать.
...
В этом алгоритме фаза параллельного отслеживания обеспечивает приближение к истинно достижимому множеству. Единственные объекты, не помеченные этим процессом параллельной трассировки, которые действительно достижимы, должны быть достижимы из помеченных объектов, которые были записаны после трассировки. Фаза трассировки "останови мир" отслеживает все такие объекты, так что, в конце концов, никакие действительно достижимые объекты не остаются без отметок.
Когда они ссылаются на трассировку сборщиков мусора, они ссылаются на сборщики, которые начинаются с обозначенных "корневых узлов" (обычно это регистры программы) и следуют указателям на каждый достижимый объект. Все недоступное - мусор.
Короче говоря, в основном параллельный сборщик выполняет большую часть работы параллельно, а затем останавливает выполнение программы, чтобы исправить любые изменения, внесенные программой во время работы сборщика. Следовательно, это "в основном параллельно".