В рубине все классы являются объектами класса Класс. Так как классы являются также объектами, VM Ruby следуют той же стратегии Сборки "мусора" объектов класса? Что решает, что объект класса безопасен для сборки "мусора"?
Когда с объектом ничего не связано, от него можно безопасно избавиться. Что касается запуска сборки мусора, это мне неизвестно.
Я понятия не имею, что такое ответ, но не могли бы вы выяснить с помощью экспериментов? Посмотрите на подборщик . Я уверен, что это очень наивный тест, и кто-то может сделать лучше, но вы получаете идею:
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:~$
Похоже, это нуждается в нитке, но, к сожалению, я должен работать, извините...
Я проверил это, ответ - похоже, что это так.
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