Сборка мусора включает в себя обход списка выделенных объектов (либо всех объектов, либо объектов определенного поколения) и определение, которые достижимы.
Не совсем. GC делятся на отслеживание и подсчет ссылок (см. Единая теория сбора мусора ). Трассирующие GC начинаются с набора глобальных корней и отслеживают все доступные им объекты. GC подсчета ссылок подсчитывает количество ссылок на каждый объект и восстанавливает его, когда счет достигает нуля. Также не требуется список, включающий недоступные объекты.
Как поддерживается этот список? Хранит ли время выполнения для языков GC гигантский список всех объектов?
Педагогические решения, такие как HLVM , могут вести список всех объектов, потому что это просто, но это редко.
Кроме того, насколько я понимаю, GC включает в себя обход стека вызовов для поиска ссылок на объекты - как алгоритм различает GC-совместимые указатели и примитивные данные?
Опять же, есть много разных стратегий. Консервативные GC не могут различить указатели и не указатели, поэтому они консервативно считают, что указатели могут быть не указателями. Педагогические GC, такие как HLVM , могут использовать такие алгоритмы, как Henderson Accurate GC в непригодной среде . Производственные GC хранят достаточно информации в стеке потоков ОС, чтобы точно определить, какие слова являются указателями (и какие кадры стека пропустить, поскольку они не связаны с управляемым кодом), а затем использовать средство поиска стека для их поиска.
Обратите внимание, что вы также должны найти локальные ссылки, хранящиеся как в регистрах, так и в стеке.