В руби реализовано автоматическое управление памятью. В большинстве случаев это хорошо. Но, к сожалению, иногда это бывает больно.
Менеджер памяти руби одновременно и элегантен, и не лишен странностей, в любую минуту готовых обернуться неприятным сюрпризом. Руби хранит объекты (RVALUE
) в так называемой куче (это не heap в классическом понимании c-программистов, у руби своя куча). На низком уровне, RVALUE
— это обычная c
-struct, состоящая из области «атрибутов» и собственно области «данных». Подробный рассказ о том, как внутри хранятся объекты выходит за рамки данной заметки; достаточно просто понимать, что каждому объекту в руби соответствует такой вот RVALUE
. Сборщик мусора считает ссылки на него, и очищает слот, когда счетчик обнуляется. В чисто академических целях скажу, что размер каждого такого слота зависит от архитектуры:
/*
* sizeof(RVALUE) is
* 20 if 32-bit, double is 4-byte aligned
* 24 if 32-bit, double is 8-byte aligned
* 40 if 64-bit
*/
Итак, у нас есть слоты (это принятое название, slot), размером около сорока байт, в которых хранятся… Вот тут и начинается самое интересное. Там не просто хранятся ссылки на объекты, размещенные в настоящей системной куче, как, наверное, подумали люди, знакомые с реализацией более традиционных сборщиков мусора.