【发布时间】:2010-02-15 09:27:13
【问题描述】:
在 ruby 中,所有类都是 Class 类的对象。由于类也是对象,Ruby VM 是否对类对象遵循相同的垃圾收集策略?什么决定了一个类对象对于垃圾回收是安全的?
【问题讨论】:
在 ruby 中,所有类都是 Class 类的对象。由于类也是对象,Ruby VM 是否对类对象遵循相同的垃圾收集策略?什么决定了一个类对象对于垃圾回收是安全的?
【问题讨论】:
一个更具体的例子,类似于 Andrew Cholakian 的回答是使用 ObjectSpace。例如:
2.1.1 :001 > ObjectSpace.count_objects[:T_CLASS]
=> 884
2.1.1 :002 > 10000.times { Class.new }
=> 10000
2.1.1 :003 > ObjectSpace.count_objects[:T_CLASS]
=> 20884
2.1.1 :004 > GC.start
=> nil
2.1.1 :005 > ObjectSpace.count_objects[:T_CLASS]
=> 884
这表明匿名类(没有保存在任何地方的常量中或被这些类的任何实例使用)确实会被垃圾收集。
【讨论】:
我对此进行了测试,答案是它看起来确实如此。
irb(main):001:0> x = [] #Memory Usage = 12MB
=> []
irb(main):002:0> 120000.times {x << Class.new} #Memory usage now at 41 MB
=> 120000
irb(main):013:0> x = []
=> []
irb(main):011:0> GC.start() #Memory usage now at 13MB
=> nil
【讨论】:
当没有任何东西链接到对象时,摆脱它是安全的。至于何时运行垃圾收集,这超出了我的知识范围。
【讨论】:
我不知道答案是什么,但你不能通过实验找出答案吗?看看pickaxe。我确信这是一个非常幼稚的测试,有人可以做得更好,但你明白了:
puts "program start"
include ObjectSpace
class SfbdTest
def initialize(a)
@a = a
end
end
define_finalizer(SfbdTest, proc{|id| puts "GC on class"} )
puts "creating instance"
x = SfbdTest.new(1)
define_finalizer(x, proc{|id| puts "GC on instance"} )
puts "zombie-ing instance"
x = nil
puts "forcing GC"
GC.start()
puts "program end"
生产:
sfbd@thing:~$ ruby -w test.rb
program start
creating instance
zombie-ing instance
forcing GC
program end
GC on instance
GC on class
sfbd@thing:~$
看起来它需要一个线程,但不幸的是我应该在工作,抱歉......
【讨论】: