В ruby все классы являются объектами класса Class. Поскольку классы также являются объектами, делает ли Ruby VM ту же стратегию сбора мусора для объектов класса? Что определяет, что объект класса безопасен для сбора мусора?
Коллекция мусора класса Ruby Class
Ответ 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]:~$
Похоже, ему нужна нить, но, к сожалению, я должен работать, извините...