Коллекция мусора класса Ruby Class

В ruby ​​все классы являются объектами класса Class. Поскольку классы также являются объектами, делает ли Ruby VM ту же стратегию сбора мусора для объектов класса? Что определяет, что объект класса безопасен для сбора мусора?

Ответ 1

Еще более конкретный пример, похожий на ответ Андрея Чолакяна, заключается в использовании 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

Когда нет ничего, связанного с объектом, безопасно избавиться от него. Поскольку -when-сбор мусора запускается, что не в моих силах.

Ответ 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"

Выдает:

[email protected]:~$ ruby -w test.rb
program start
creating instance
zombie-ing instance
forcing GC
program end
GC on instance
GC on class
[email protected]:~$ 

Похоже, ему нужна нить, но, к сожалению, я должен работать, извините...