Ruby 可以存储的对象数量是否存在理论上的限制?

Is there a theoretical limit to the number of objects Ruby can store?

起码比20_000_000多一点,数字的object_id是数字的2倍+1:

1454.object_id # => 2909

在大号上调用 object_id 时,不会保留此格式。理论上您可以拥有的对象数量似乎存在内置限制。我运行:

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

所以在 100,000,000 个字符串对象中,实际上只有大约 50,000 个是唯一的。这意味着这些对象中有 99.95% 是同一个对象。我不确定这是为什么。

如何分配对象 ID 取决于实现。在 C-ruby 上,对象 id 只是对象内存地址的数值(除了一些立即数例外,如 true、false、nil、Fixnums)。

因此,两个活动对象不能共享相同的对象 ID(很好!),但是如果您触发垃圾回收,则某些内存位置(即堆槽)可能会被重用,因此对象 ID 也会被重用。

另一个结果是你永远不会 运行 超出对象 ID(除非你用尽进程的地址 space,但如果发生这种情况你就有麻烦了)