Bien, este es mi segundo intento de depurar los problemas de memoria con mi aplicación Sinatra. Creo que lo tengo encriptado en código de muestra simple esta vez.Ruby Symbol # to_proc filtra referencias en 1.9.2-p180?
Parece que al filtrar una matriz a través de .map(&:some_method)
, hace que los elementos de esa matriz no se recojan basura. Ejecutar el equivalente .map{|x| x.some_method}
es totalmente correcto.
Demostración: Dada una clase de ejemplo simple:
class C
def foo
"foo"
end
end
Si me quedo en la siguiente IRB, sea recolectado normalmente:
ruby-1.9.2-p180 :001 > a = 10.times.map{C.new}
=> [...]
ruby-1.9.2-p180 :002 > b = a.map{|x| x.foo}
=> ["foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo"]
ruby-1.9.2-p180 :003 > ObjectSpace.each_object(C){}
=> 10
ruby-1.9.2-p180 :004 > a = nil
=> nil
ruby-1.9.2-p180 :005 > b = nil
=> nil
ruby-1.9.2-p180 :006 > GC.start
=> nil
ruby-1.9.2-p180 :007 > ObjectSpace.each_object(C){}
=> 0
Así que no hay referencias a C existe más. Bueno. Pero sustituyendo map{|x| x.foo} with map(&:foo)
(que se anuncia como equivalente), que no consigue recogido:
ruby-1.9.2-p180 :001 > a = 10.times.map{C.new}
=> [...]
ruby-1.9.2-p180 :002 > b = a.map(&:foo)
=> ["foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo"]
ruby-1.9.2-p180 :003 > ObjectSpace.each_object(C){}
=> 10
ruby-1.9.2-p180 :004 > a = nil
=> nil
ruby-1.9.2-p180 :005 > b = nil
=> nil
ruby-1.9.2-p180 :006 > GC.start
=> nil
ruby-1.9.2-p180 :007 > ObjectSpace.each_object(C){}
=> 10
ruby-1.9.2-p180 :008 >
Es esto un error de rubí? Voy a probar en más versiones de ruby para estar seguro, pero esto parece ser un problema obvio. ¿Alguien sabe lo que estoy haciendo mal?
Editar:
He intentado esto en 1.8.7-P352 y no tiene el problema. 1.9.3-preview1 does Sin embargo, todavía tiene el problema. ¿Hay un informe de error en orden o estoy haciendo algo mal?
Edit2: formatear (¿por qué no poner cuatro espacios antes de cada sintaxis de la línea de productos, mientras que destaca <pre>
etiquetas no lo hacen)
Voy a tratar de enviar un informe de error pero estoy teniendo problemas para configurar una cuenta en el redmine Ruby. Esperaré hasta más tarde en caso de que tengan problemas con su sistema de inicio de sesión. –
Estoy usando Google Mail y marcó su correo de confirmación como correo no deseado. Tal vez deberías revisar tu carpeta de spam: D –
¡Buena llamada! No tenía idea de que incluso enviaron un correo de confirmación. De todos modos, Bug # 5261: http://redmine.ruby-lang.org/issues/5261 –