orientado - programacion con objetos ruby
Colección de basura objeto Ruby Class (4)
En ruby todas las clases son objetos de clase. Dado que las clases también son objetos, ¿una máquina virtual Ruby sigue la misma estrategia de recolección de basura para los objetos de clase? ¿Qué determina que un objeto de clase es seguro para la recolección de basura?
Cuando no hay nada relacionado con el objeto, es seguro deshacerse de él. En lo que respecta a la ejecución de la recolección de basura, eso está fuera de mi conocimiento.
He probado esto, la respuesta es que parece que lo hace.
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
No tengo idea de cuál es la respuesta, pero ¿no podrías descubrirlo mediante la experimentación? Echa un vistazo a la pickaxe . Estoy seguro de que esta es una prueba muy ingenua, y alguien puede hacerlo mejor, pero entiendes la idea:
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"
Produce:
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:~$
Parece que necesita un hilo, pero lamentablemente debo trabajar, lo siento ...
Un ejemplo aún más concreto, similar a la respuesta de Andrew Cholakian, es usar ObjectSpace. Por ejemplo:
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
Esto muestra que las clases anónimas (que no se guardan en una constante en ninguna parte ni son utilizadas por ninguna instancia de esas clases) sí se recogen basura.