Ruby Class объект сборка мусора - PullRequest
22 голосов
/ 15 февраля 2010

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

Ответы [ 4 ]

12 голосов
/ 14 мая 2014

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

Это показывает, что анонимные классы (нигде не сохраненные в константе и не используемые какими-либо экземплярами этих классов) действительно получают мусор.

1 голос
/ 18 февраля 2010

Я проверил это, ответ таков:

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 голосов
/ 16 февраля 2010

Понятия не имею, каков ответ, но не могли бы вы узнать экспериментально? Взгляните на кирку . Я уверен, что это очень наивный тест, и кто-то может сделать лучше, но вы поняли:

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

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

0 голосов
/ 15 февраля 2010

Если с объектом ничего не связано, от него можно безопасно избавиться. Насколько-то, когда запускается сборка мусора, это мне не известно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...