类的大小(以字节为单位)

时间:2013-05-09 07:20:17

标签: ruby class memory methods

是否有方法可以在ruby中查看类的已分配内存大小?

我已经构建了一个自定义类,我想知道它在内存中的大小。那么在C中是否存在sizeof()的相似性的函数

我只是想尝试初始化一个新的类

test = MyClass.new

并尝试找到一种方法来打印出已分配给内存的类的大小。

这在红宝石中甚至可能吗?

1 个答案:

答案 0 :(得分:6)

没有语言功能可以像C一样计算类的大小。

对象的内存大小取决于实现。它取决于基类对象的实现。估计使用的内存也不容易。例如,如果字符串很短,则可以将它们嵌入到RString结构中,如果它们很长(Never create Ruby strings longer than 23 characters),则可以存储在堆中。

一些对象占用的内存已经制成表格,用于不同的ruby实现:Memory footprint of objects in Ruby 1.8, EE, 1.9, and OCaml

最后,即使来自同一个类的两个对象,对象大小也可能不同,因为可以任意添加额外的实例变量,而无需对存在的实例变量进行硬编码。例如,请参阅instance_variable_getinstance_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解释器何时执行垃圾收集。虽然您可以将其用于测试和实验,但建议不要在生产中使用它!