2015-03-25 3 views
2

По крайней мере, до чуть более 20_000_000, то object_id s чисел в 2 раза число + 1:Есть ли теоретический предел для количества объектов, которые может хранить Ruby?

1454.object_id # => 2909 

При вызове object_id на большом количестве, этот формат не сохраняется. Похоже, есть встроенный предел количества объектов, которые вы теоретически могли бы иметь. Я бежал:

ids = [] 
100_000_000.times { ids << String.new.object_id } 
ids.max # => 22314984 
ids.uniq.count # => 44301 

Так что из 100-миллионных струнных объектов только около 50 000 были действительно уникальными. Это означает, что 99,95% этих объектов были одним и тем же объектом. Я не знаю, почему это так.

+0

Я считаю, что она ограничивается суммой сервера памяти, но это только мое мнение. –

+0

Просто побежал. Нет, это не вызвало никаких ошибок. Я сомневаюсь, что это полезно, хотя гипотетический предел может быть выше. –

+0

Вы запустили этот код без 'MemoryAllocationError'? –

ответ

5

Как распределяются идентификаторы объектов, зависит от реализации. В C-ruby идентификатор объекта - это просто числовое значение адреса памяти объекта (за некоторыми исключениями для таких значений, как true, false, nil, Fixnums).

Поэтому два живых объекта не могут использовать один и тот же идентификатор объекта (хорошо!), Однако если вы запускаете сборку мусора, то некоторые из мест памяти (например, кучи) могут быть повторно использованы и, следовательно, объекты тоже.

Другим следствием является то, что вы никогда не будете запускать из объектных идентификаторов (если не исчерпывают адресное пространство процесса, но вы в беде в любом случае, если это произойдет)

+0

Для справки [this] (https://github.com/ruby/ruby/blob/4e8fbe17787fe3d46431087f791ed443b1010e19/gc.c#L2873) является то, как 'object_id' реализуется в текущей МРТ. –

Смежные вопросы