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

时间:2015-03-25 16:06:20

标签: ruby oop object objectid

至少高于20_000_000object_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%的这些对象是同一个对象。我不确定为什么会这样。

1 个答案:

答案 0 :(得分:5)

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

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

另一个结果是你永远不会耗尽对象id(除非你耗尽了进程的地址空间,但如果发生这种情况你仍然会遇到麻烦)