Что не так с GC с меткой и меткой? - PullRequest
8 голосов
/ 23 октября 2009

Я читаю доклад Стива Йегге "Dynamic Languages ​​Strike Back" , и в нем он как бы критикует GC с меткой-зачисткой (примерно 5-10 процентов по этой ссылке, "попытка свиней" летать "слайд) Что с ними не так?

Ответы [ 3 ]

31 голосов
/ 23 октября 2009

Вот высокоуровневое сопоставление маркеров различных методов, упомянутых в цитируемой цитате (плюс «отметка и компактность» ... что является вариацией отметки и разметки.)

Свойства коллекции подсчета ссылок:

  • PRO - мусор утилизируется немедленно (кроме циклов)
  • PRO - паузы сбора мусора меньше и минимальны, если вы можете отложить обновление структуры данных «свободного места».
  • CON - счетчик ссылок должен быть скорректирован в большинстве операций записи указателя
  • CON - свободное пространство никогда не сжимается
  • CON - поскольку свободное пространство не сжимается, должна поддерживаться структура данных «свободного пространства», что увеличивает затраты на выделение и освобождение.
  • CON - циклический мусор не собирается, если только приложение не прерывает цикл вручную.
  • CON - обновление счетчиков ссылок в многопоточном приложении обходится слишком дорого.

Для классической разметки:

  • PRO - нет указателя при записи
  • PRO - циклические данные собираются
  • PRO - можно избежать узких мест в параллельном управлении хранилищем (кроме GC)
  • CON - остановка сборки мусора
  • CON - свободное пространство никогда не сжимается
  • CON - поскольку свободное пространство не сжимается, должна поддерживаться структура данных «свободного пространства», которая увеличивает затраты на выделение и освобождение.

Классическая метка-развертка иногда модифицируется таким образом, что фаза развертки уплотняет свободное пространство путем «скольжения» объектов без мусора. Это называется "mark-sweep-compact". Это довольно сложно, но:

  • PRO - нет указателей при записи
  • PRO - циклические данные собираются
  • PRO - узких мест параллелизма в управлении хранением можно легко избежать (кроме GC)
  • CON - сборщик мусора "останови мир"
  • PRO - свободное место сжимается, поэтому выделение является дешевым
  • CON - компактная фаза довольно дорогая

Современные коллекционеры (в том числе типичные коллекционные коллекторы) основаны на пометках и копиях. Идея состоит в том, что сборщик отслеживает объекты в «из космоса», копируя их в «в космос». Когда это сделано, в конце «to space» появляется непрерывный кусок свободного пространства, который можно использовать для выделения новых объектов. Старый «из космоса» кладется на одну сторону в следующий раз, когда запускается сборщик мусора. Хорошая особенность копирования коллекции заключается в том, что стоимость сборки мусора, связанной с объектом мусора, близка к нулю.

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

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

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

10 голосов
/ 23 октября 2009

Вот контекст цитаты:

Поколение сборщиков мусора является лучший ответ, который я получил за это, потому что это уменьшает паузы, и, честно говоря, сборщики мусора для всех [новые] динамические языки сегодня дерьмо. Они метят и убирают, или они сосчитаны.

Из цитаты он, похоже, говорит о довольно примитивных GC, которые не относятся к поколению. ГК поколений все еще можно пометить и развернуть, но в большинстве случаев их гораздо меньше, чтобы пометить, что делает их намного быстрее, чем «отмечать и охватывать мир каждый раз».

Предполагая, что он имел в виду, я согласен - но он мог бы выразить это более ясно. Имейте в виду, что это был разговор, а не докторская диссертация - придумать самый ясный способ выразить себя «на копыте» довольно сложно:)

5 голосов
/ 23 октября 2009

Он сравнивает это с mark-compact :

Поколение сборщиков мусора - лучший ответ, который я получил за это, потому что он уменьшает паузы, и, честно говоря, сборщики мусора для всех [новых] динамических языков сегодня являются дерьмом. Они метят и убирают, или они подсчитывают ссылки.

ГХ с простыми метками и зачистками не так хороши, потому что у них есть проблема фрагментации кучи. При высоких уровнях выделения, распространенных в языках с поддержкой GC, это обычно становится проблемой быстрее, чем, например, в. C ++, где в стеке просто живет множество объектов.

Тем не менее, mark-compact - это действительно mark & ​​sweep с компактированием, поэтому терминология может быть лучше. Некомпактные коллекторы обычно называют «консервативными», чтобы различать их.

...