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

Ruby 类的大小(以字节为单位),ruby,class,memory,methods,Ruby,Class,Memory,Methods,是否有一种方法可以查看ruby中类的分配内存大小 我已经建立了一个自定义类,我想知道它在内存中的大小。那么在C语言中是否有类似于sizeof()的函数呢 我只是想初始化一个新类,就像这样 test = MyClass.new 并试图找到一种方法来打印已分配给内存的类的大小 这在ruby中是可能的吗?没有语言特性可以像C一样计算类的大小 对象的内存大小取决于实现。它取决于基类对象的实现。估计使用的内存也不简单。例如,如果字符串较短,则可以将其嵌入到RString结构中;如果字符串较长,则可以将其

是否有一种方法可以查看ruby中类的分配内存大小

我已经建立了一个自定义类,我想知道它在内存中的大小。那么在C语言中是否有类似于
sizeof()
的函数呢

我只是想初始化一个新类,就像这样

test = MyClass.new
并试图找到一种方法来打印已分配给内存的类的大小


这在ruby中是可能的吗?

没有语言特性可以像C一样计算类的大小

对象的内存大小取决于实现。它取决于基类对象的实现。估计使用的内存也不简单。例如,如果字符串较短,则可以将其嵌入到RString结构中;如果字符串较长,则可以将其存储在堆中()

对于不同的ruby实现,某些对象占用的内存已制成表格:

最后,即使是来自同一类的两个对象,对象大小也可能不同,因为可以任意添加额外的实例变量,而无需硬编码存在哪些实例变量。例如,请参见和


如果您使用MRI ruby 1.9.2+,有一种方法可以尝试(请注意,它只查看对象的一部分,这一点很明显,因为整数和字符串的大小似乎为零):

您还可以尝试memsize_of_all(注意,它查看整个解释器的内存使用情况,覆盖变量似乎不会立即删除旧副本):


您应该非常小心,因为无法保证Ruby解释器何时执行垃圾收集。虽然您可以将其用于测试和实验,但建议不要在生产中使用

这个问题至少有两个复杂之处:1)对象的所有属性也是其他类的对象,因此您需要清楚这些属性是否包括在内。2) 在Ruby中,实例变量的数量和类型是动态的,因此实际上不存在类的内存大小。但是,从理论上讲,您可以测量当前分配给对象的内存(尽管我目前不知道如何,或者Ruby是否允许您这样做)。是否可以初始化X个类,然后在前后提取ruby解释器的内存使用率?我遇到了一个问题,在它们自己的线程中的每个套接字都将获得我的3个类的一个副本(用于数据包处理等),因此如果有10个连接,那么每个类都有30个实例。我想知道这是否是一个基本的设计问题,我将不得不重新编码/思考我的数据包处理,或者如果3个类导致内存使用量极小。当我简单地运行
puts ObjectSpace时,这会产生有趣的结果。memsize\u of_all
我得到一个估计值
1180174
,但当我运行
(0..1000)时.每个人都做;t、 推送PacketParser.newi;end
放置ObjectSpace.memsize\u of_all
我得到
920578
,这比没有初始化3000多个类时的值要小。除了垃圾处理之外,我还缺少什么吗?它不是真的创建了3000个类,而是简单地引用了3个类或其他什么吗?我很难回答这个问题-你可以检查每个迭代(也许你会在一些迭代中看到突然减少)。您应该知道,在上面的迭代中,您不仅仅是在为对象分配内存。PacketParser构造函数和t.push方法也可能分配局部变量,这(暂时)会增加内存使用。我已经进行了一些理论测试,得出了一个令人满意的结论,我可以接受。谢谢你的帮助
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
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