Какой алгоритм восстановления памяти использует MRI Ruby 1.8? - PullRequest
2 голосов
/ 15 июня 2009

На других языках у вас есть ряд возможностей, как правило, для восстановления памяти:

  • Пометить объекты, а затем удалить их
  • Явное сохранение и освобождение
  • Количество ссылок на объекты
  • Внутреннее расположение кучи

Как работает Ruby?

Ответы [ 3 ]

3 голосов
/ 15 июня 2009

Сборщик мусора Ruby 1.8 на самом деле довольно ужасен. Каждые 7 Мб выделения он будет выполнять этап отметки для всех корневых объектов и попытаться найти, какие из них могут быть достигнуты. Те, кого невозможно достичь, будут освобождены.

Однако, чтобы узнать, какие объекты достижимы, он проверяет стек, регистры и выделенную память объекта. Это допускает некоторые ложные срабатывания, но облегчает написание расширений C: расширения C не должны ссылаться и ссылаться, так как стек и т. Д., Которые используют расширения C, автоматически сканируются.

Кроме того, состояние объекта (указано или нет) сохраняется в состоянии каждого объекта. Это очень плохо сказывается на поведении кэша и копировании при записи: во время этого процесса затрагивается множество строк кэша, а интерпретаторы ruby ​​не разделяют столько памяти, сколько могли бы, если у вас их больше, чем один (актуально для сервера развертывание как Ruby on Rails). Поэтому существуют другие реализации (Ruby Enterprise Edition), которые делают это в отдельной части памяти для ускорения GC.

Также проблема в длинных связанных списках. Так как mark-and-sweep использует стек для рекурсии, длинный связанный список segfaults ruby.

GC также не уплотняет, и это становится проблематичным в долгосрочной перспективе.

Однако, если вы запустите JRuby, эти проблемы исчезнут при сохранении совместимости с Ruby 1.8 до некоторой степени.

1 голос
/ 15 июня 2009

"консервативная метка и развертка"

См. эту ветку , которая включает описание Маца, которое должно быть окончательным.

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