GC Mark-and-Sweep, как и почти каждый алгоритм, обычно помеченный как сборщик мусора, сохраняет подсчет ссылок, прекрасно обрабатывает циклические ссылки.Это не имеет ничего общего с конкретной реализацией.Независимо от фактического GC, используемого Ruby 1.9, у него не будет проблем с циклами.Вот набросок подхода сборщиков меток и свипов, но будьте уверены, что другие схемы сбора также справляются с циклическими ссылками.
- Отметьте все вещи, о которых известно, что они всегда достижимы («корни»,в основном все, что находится непосредственно в области видимости - глобальные переменные, локальные переменные и т.помеченные объекты остаются
- Перечисляет все выделенные объекты, освобождает те, которые не отмечены
Видите ли, круг ссылок, который доступен "извне", не приводит к бесконечной рекурсии(мы не обращаемся к ссылкам данного объекта более одного раза), а круг ссылок, который недоступен, не помечается как достижимый и, следовательно, освобождается (каждый элемент независимо) после маркировки.