是否有方法可以查看 Ruby 中类实例分配的内存大小?
我已经构建了一个自定义类,我想知道它在内存中的大小和对象。那么C中是否有类似
sizeof()
的函数呢?
我只是想像这样初始化一个新对象
test = MyClass.new
并试图找到一种方法来打印出已分配到内存的对象的大小。
这在 Ruby 中可能吗?
没有任何语言功能可以像 C 那样计算类的大小。
对象的内存大小取决于实现。这取决于基类对象的实现。估计所使用的内存也并不简单。例如,如果字符串很短,则可以将其嵌入到 RString 结构中,但如果字符串很长,则可以将其存储在堆中(切勿创建长度超过 23 个字符的 Ruby 字符串)。
针对不同的 Ruby 实现,一些对象占用的内存已按表格列出:Ruby 1.8、EE、1.9 和 OCaml 中对象的内存占用
最后,即使来自同一类的两个对象,对象大小也可能不同,因为可以任意添加额外的实例变量,而无需对存在的实例变量进行硬编码。例如,请参阅 instance_variable_get 和 instance_variable_set
如果您使用 MRI ruby 1.9.2+,您可以尝试一种方法(请注意,它仅查看对象的一部分,这从整数和字符串似乎具有零大小的事实中显而易见):
irb(main):176:0> require 'objspace'
=> true
irb(main):176:0> ObjectSpace.memsize_of(134)
=> 0
irb(main):177:0> ObjectSpace.memsize_of("asdf")
=> 0
irb(main):178:0> ObjectSpace.memsize_of({a: 4})
=> 184
irb(main):179:0> ObjectSpace.memsize_of({a: 4, b: 5})
=> 232
irb(main):180:0> ObjectSpace.memsize_of(/a/.match("a"))
=> 80
您还可以尝试 memsize_of_all (注意,它查看整个解释器的内存使用情况,覆盖变量似乎不会立即删除旧副本):
irb(main):190:0> ObjectSpace.memsize_of_all
=> 4190347
irb(main):191:0> asdf = 4
=> 4
irb(main):192:0> ObjectSpace.memsize_of_all
=> 4201350
irb(main):193:0> asdf = 4
=> 4
irb(main):194:0> ObjectSpace.memsize_of_all
=> 4212353
irb(main):195:0> asdf = 4.5
=> 4.5
irb(main):196:0> ObjectSpace.memsize_of_all
=> 4223596
irb(main):197:0> asdf = "a"
=> "a"
irb(main):198:0> ObjectSpace.memsize_of_all
=> 4234879
您应该非常小心,因为无法保证 Ruby 解释器何时执行垃圾收集。虽然您可以使用它进行测试和实验,但建议不要在生产中使用它!