Ruby Class对象垃圾回收

时间:2010-02-15 09:27:13

标签: ruby garbage-collection

在ruby中,所有类都是Class类的对象。由于类也是对象,Ruby VM是否遵循针对类对象的相同垃圾收集策略?是什么决定了类对象对垃圾收集是否安全?

4 个答案:

答案 0 :(得分:12)

一个更具体的例子,类似于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 

这表明匿名类(未保存在任何地方的常量中或由这些类的任何实例使用)确实会被垃圾收集。

答案 1 :(得分:1)

我测试了这个,答案是它看起来像。

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

答案 2 :(得分:0)

如果没有任何链接到对象,那么摆脱它是安全的。至于-when-垃圾收集运行,这是我所不知道的。

答案 3 :(得分:0)

我不知道答案是什么,但你能不能通过实验找到答案?看看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:~$ 

看起来它需要一个线程,但不幸的是我应该工作,对不起......