rails programacion orientado orientada objetos metodos manejo lenguaje herencia ejemplos con clases ruby garbage-collection

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.