有没有办法在
ruby中查看类的已分配内存的大小?
我已经构建了一个自定义类,我想知道它在内存中的大小.那么在C中是否有与sizeof()相似的函数?
我只是想尝试初始化一个新类
test = MyClass.new
并试图找到一种方法来打印出已分配给内存的类的大小.
这在ruby中甚至可能吗?
解决方法
没有语言功能可以像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_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解释器何时执行垃圾收集.虽然您可以将其用于测试和实验,但建议不要在生产中使用它!