TL;DR
require 'objspace'
ObjectSpace.memsize_of([0] * 1_000_000)
#=> 8000040
ObjectSpace.memsize_of(Array.new([0] * 1_000_000))
#=> 40
Куда он пошел?
Более длинная версия
Вся совокупность вещей внутри массива, похоже, имеет концепцию "общего массива", где блок данных перемещается в разделяемое пространство кучи. Я знаю, что memsize_of
дает понять, что он может быть неполным, но есть ли (хороший?) Способ проанализировать распределение этих разделяемых блоков блоков? Они не кажутся "объектами" с точки зрения ObjectSpace.each_object
. Для целей этого профилирования памяти было бы неплохо, по крайней мере, иметь возможность отслеживать общий размер пространства кучи разделенного массива, даже если я не могу отследить его обратно к конкретным объектам.