【问题标题】:Ruby Class object garbage collectionRuby 类对象垃圾回收
【发布时间】:2010-02-15 09:27:13
【问题描述】:

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

【问题讨论】:

    标签: ruby garbage-collection


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我对此进行了测试,答案是它看起来确实如此。

      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
      

      【讨论】:

        【解决方案3】:

        当没有任何东西链接到对象时,摆脱它是安全的。至于何时运行垃圾收集,这超出了我的知识范围。

        【讨论】:

        • 这通常是正确的,但类可以被视为一种特殊情况。例如,如果一个类没有实例并且没有被任何其他类子类化,它没有“链接”(如你所说),但它对 GC 真的安全吗?如果有人打算在以后用它构建一个实例怎么办。我认为课程的情况并不像您所说的那样明确:)
        • @banister:这正是我想指出的其他特殊情况,其中 GC 可能必须以特殊方式处理类对象
        • 很公平。一个类只不过是一个常数,不是吗?而且你不能摆脱一个常量,因为它是环境中的一个变量(即使它是 IRB 的“主要”对象或运行时),直到环境完成。 “class String”与“String = Class.new”是一样的。
        • @Trevoke:哎呀!类不是常量;这是一个常量的“类名”
        • @Vaibhav 至少你明白我的意思 :-)
        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-08
          • 1970-01-01
          • 2017-06-20
          • 2010-11-08
          • 2015-02-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多