Размеры объекта для сборщика мусора

Учитывает ли сборщик мусора в [ruby](/tag1546) размер и количество объектов? Для оптимизации я рассматриваю возможность замены экземпляров  `Class`  с помощью  `Struct`  s или plain  `Hash`  es. Я хотел бы понять, какие классы будут иметь наибольшее влияние на сбор мусора.

Парень, который сказал, что вы должны сравнить это правильно - GC - сложная проблема, и сложно дать 100% правильный ответ.

Кроме того, это зависит от используемой реализации. В JRuby это работает JVM. В МРТ это метка и развертка.

В случае MRI это работает примерно так: каждый раз, когда интерпретатору [ruby](/tag1546) требуется больше памяти, он запускает GC, чтобы попытаться освободить его. Если памяти недостаточно, она будет выделять больше. И GC решает, что объект в порядке, чтобы его освободить («отметьте» его), когда нет ссылок на него.

Единственный совет, который я могу вам дать, - избегать использования большого количества объектов, которые не могут быть собраны в мусор. Например, если вы создаете массив строк (их размер не важен), вы должны увидеть снижение производительности намного быстрее, чем если бы вы создали большую строку, объединяющую каждую из меньших.

Это связано с тем, что в последнем GC может уничтожить маленькие строки после их использования, в то время как в первом массиве всегда сохраняется ссылка на каждую из них.

EDIT: Конечно, это предполагает, что стоимость их сохранения в памяти больше, чем замедление работы с «большой струной». В некоторых случаях лучше иметь небольшие строки, а затем объединять их всех - что приводит к одной медленной операции. Опять же, это просто примеры без контрольных показателей, не воспринимайте их очень серьезно.