Сбор мусора по круговому списку в рубине - PullRequest
2 голосов
/ 24 июня 2011

Я узнаю о подходе ruby's mark и sweep к уборке мусора. Я наткнулся на несколько потоков тут и там (и эту статью через SO-поток, который я больше не могу заметить), но они, похоже, относились к более старым версиям ruby, и информация в них не была всегда последовательный (В сложившейся ситуации у меня складывается впечатление, что это в основном подсчет ссылок.)

Может ли кто-нибудь, имеющий некоторое представление о внутренностях ruby ​​1.9.2, быть в курсе, знает ли ruby, как обрабатывать более сложные обратные ссылки и циклические ссылки? (В идеале с несколькими подробностями / хорошими указателями о том, как это на самом деле реализовано.)

1 Ответ

4 голосов
/ 24 июня 2011

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

  1. Отметьте все вещи, о которых известно, что они всегда достижимы («корни»,в основном все, что находится непосредственно в области видимости - глобальные переменные, локальные переменные и т.помеченные объекты остаются
  2. Перечисляет все выделенные объекты, освобождает те, которые не отмечены

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...