Сборщик мусора 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 до некоторой степени.