В двух словах : сборщики мусора не используют рекурсию. Они просто контролируют трассировку, отслеживая по существу два набора (которые могут объединяться). Порядок трассировки и обработки ячеек не имеет значения, что дает значительную свободу реализации для представления наборов. Следовательно, есть много решений, которые на самом деле очень дешевы в использовании памяти. Это важно, так как GC вызывается именно тогда, когда в куче не хватает памяти. С большим количеством виртуальной памяти все немного по-другому, поскольку новые страницы могут быть легко выделены, и врагом является не недостаток места, а недостаток локальности данных
.
Я предполагаю, что вы рассматриваете возможность поиска сборщиков мусора, а не подсчета ссылок, к которым ваш вопрос, похоже, не относится.
Вопрос заключается в том, чтобы сосредоточить внимание на стоимости памяти для отслеживания набора: набора (для неотслеживаемых) доступных ячеек памяти, которые все еще содержат указатели, которые еще не отслежены.UЭто только половина проблемы с памятью
для сборки мусора. GC также должен отслеживать другой набор: набор (для посещенных) всех ячеек, которые были найдены доступными, чтобы освободить все другие ячейки в конце процесса. Обсуждение одного, а не другого имеет ограниченный смысл, поскольку они могут иметь одинаковую стоимость, использовать сходные решения и даже объединяться.В
Первое, что следует отметить, это то, что все трассирующие GC следуют одной и той же абстрактной модели, основанной на систематическом исследовании ориентированного графа ячеек в памяти, доступной из программы, где ячейки памяти являются вершинами, а указатели - направленными ребрами. Для этого используются следующие наборы:
набор (посещенных) ячеек, которые уже были найдены мутатором , то есть программа или алгоритм, для которого выполняется GC. Множество V разбивается на два непересекающихся подмножества:
V = U ∪ T ;ВВВ= U∪ T
набор (не отслеженный) посещенных ячеек с указателями, которые еще не отслеживались;U
набор (отслеженный) посещенных ячеек, в которых отслежены все их указатели.T
мы также отмечаем ЧАС
ВUUT
UВ
UсВUсUT
UUВ= ТВЧАС- VВ
ВUUT
Я также пропускаю подробности о том, что такое ячейка, входят ли они в один или несколько размеров, как мы находим в них указатели, как они могут быть сжаты, и множество других технических проблем, которые вы можете найти в книгах и обзорах по сбору мусора. ,
UНет априорных предположений о дополнительной памяти.
Что бы ни позволяло идентифицировать наборы и делать достаточно дешево необходимые операции. Обратите внимание, что порядок, в котором обрабатываются ячейки, не имеет значения (нет особой необходимости в стеке пуш-апов), что дает большую свободу выбора средств для эффективного представления наборов.
Отличие известных реализаций заключается в способе представления этих наборов. Многие методы были фактически использованы:
Битовая карта. Некоторое пространство памяти сохраняется для карты, в которой есть один бит для каждой ячейки памяти, который можно найти по адресу ячейки. Бит включается, когда соответствующая ячейка находится в наборе, определенном картой. Если используются только битовые карты, вам нужно только 2 бита на ячейку.
альтернативно, у вас может быть место для специального бита тега (или 2) в каждой ячейке, чтобы пометить его.
журнал2пп
Вы можете проверить предикат на содержание ячейки и ее указатели.
Вы можете переместить ячейку в свободную часть памяти, предназначенную для всех только ячеек, принадлежащих представленному набору.
ВTTU .
Вы можете комбинировать эти приемы даже для одного набора.
Как уже говорилось, все вышеперечисленное использовалось каким-то реализованным сборщиком мусора, как ни странно. Все зависит от различных ограничений реализации. И они могут быть довольно дешевы в использовании памяти, возможно, с помощью политик обработки заказов которые могут быть свободно выбраны для этой цели, поскольку они не имеют значения для конечного результата.
То, что может показаться странным, перенос клеток в новую область, на самом деле очень распространено: это называется сбором копий. В основном используется с виртуальной памятью.
Очевидно, что нет рекурсии, и стек алгоритма мутатора не должен использоваться.
Другим важным моментом является то, что многие современные GC реализованы для больших виртуальных воспоминаний . В этом случае получение пространства для реализации и дополнительного списка или стека не является проблемой, поскольку новые страницы могут быть легко выделены. Однако, в больших виртуальных воспоминаниях, враг - это не недостаток места, а недостаток локальности . Затем структура, представляющая наборы и их использование, должна быть ориентирована на сохранение локальности структуры данных и выполнения GC. Проблема не в пространстве, а во времени. Неадекватные реализации с большей вероятностью будут показывать недопустимое замедление, чем переполнение памяти.
Я не давал ссылки на многие конкретные алгоритмы, возникающие в результате различных комбинаций этих методов, поскольку это кажется достаточно длинным.