Работа в соответствии с назначением
Это утечка, если и только если память не возвращается в систему после выхода Ruby. Поскольку описываемое вами поведение не является справедливым, можно сказать, что ваш интерпретатор работает, как задумано.
Подробнее о том, как сборщик мусора Ruby работает на высоком уровне, см. Ниже. и почему ваше построение массивов так интенсивно использует память.
Нет утечки памяти
Это не утечка; Вот как работает Ruby сборщик мусора ! По сути, это сборщик мусора с меткой-зачисткой, с новой поддержкой сжатия. На высоком уровне Ruby выделяет память для объектов, все еще находящихся в области, и, как правило, не освобождает выделение, пока все ссылки go не попадают в область.
Ruby сборка мусора не хорошо документированы за пределами исходного кода, а реализация немного сложнее, чем я описал выше. Кроме того, реализация сборки мусора может варьироваться от выпуска к выпуску, а также от разных интерпретаторов (например, J Ruby и MRI)! Тем не менее, достаточно понять, что вы видите.
По сути, 100000000000.times do a.push([1]) end
доставит sh элемент в массив a 100 миллионов раз. Пока a находится в области, память не будет собирать мусор. Даже если вы вручную запустите процедуры сборки мусора после того, как a выйдет из области видимости, Ruby может или не может освободить память, если система не находится под давлением памяти.
Я бы не стал не беспокойтесь об этом, если у вас нет очень долгоживущих процессов, которым нужно хранить миллионы записей в активной памяти. Если вы это сделаете, специальный кэш или база данных (например, memcached, Redis) могут быть более эффективными.