Ruby Class object garbage collection

后端 未结 4 1400
不思量自难忘°
不思量自难忘° 2021-01-07 17:22

In ruby all classes are objects of class Class. Since classes are also objects, does a Ruby VM follow the same Garbage Collection strategy for class objects? What determines

相关标签:
4条回答
  • 2021-01-07 18:01

    When there is nothing linking to the object, then it's safe to get rid of it. As far as -when- garbage collection is run, that is beyond my knowledge.

    0 讨论(0)
  • 2021-01-07 18:05

    I tested this out, the answer is it looks like it does.

    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
    
    0 讨论(0)
  • 2021-01-07 18:16

    I have no idea what the answer is, but could you not find out by experimentation? Have a look at the pickaxe. I'm sure that this is a very naive test, and someone can do better, but you get the idea:

    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"
    

    Produces:

    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:~$ 
    

    Looks like it needs a thread, but unfortunately I'm supposed to be working, sorry...

    0 讨论(0)
  • 2021-01-07 18:20

    An even more concrete example, similar to Andrew Cholakian's answer is to use ObjectSpace. For example:

    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 
    

    This shows that anonymous classes (not saved in a constant anywhere or used by any instances of those classes) do indeed get garbage collected.

    0 讨论(0)
提交回复
热议问题