2012-05-24 21 views
5

disparé mi consola IRB JRuby y proporcionado:JRuby - ¿Cómo iniciar el recolector de basura?

irb(main):037:0* GC.enable 
(irb):37 warning: GC.enable does nothing on JRuby 
=> true 
irb(main):038:0> GC.start 
=> nil 
irb(main):039:0> 

¿Cómo puedo activar o iniciar la basura JVM durante un programa de forma manual?

Lo pido porque tengo un programa que necesita generar unos 500 MBytes de datos de prueba y guardarlos en MySQL. El programa utiliza aproximadamente 5 niveles de bucles anidados y se bloquea con una excepción de almacenamiento dinámico de memoria JVM después de generar aproximadamente 100 MB de datos de prueba porque no hay más memoria de almacenamiento dinámico. Me gustaría dejar que el recolector de basura se ejecute después de cada ejecución del ciclo externo para que todos los objetos huérfanos creados en los bucles internos se puedan limpiar.

+1

Es poco probable que ayude, porque si la JVM se queda sin memoria, ejecutará el GC antes de darse por vencido. Es posible que deba asegurarse de no tener referencias más largas de lo necesario y/o aumentar el tamaño del almacenamiento dinámico. – theglauber

Respuesta

10

La respuesta exacta a su pregunta sería:

require 'java' 

java_import 'java.lang.System' 

# ... 

System.gc() 

embargo, teniendo en cuenta a pesar de que la JVM normalmente no ejecutar el GC, que puede o no puede hacerlo - depende mucho de la JVM implementación. También puede ser un gran golpe en el rendimiento.

Una respuesta mejor es, obviamente, garantizar que al final del bucle anidado, no se tenga ninguna referencia sobre los datos de prueba que está generando, para que puedan ser reclamados posteriormente por el GC. Ejemplo:

class Foo; end 

sleep(5) 

ary = [] 
100_000.times { 100_000.times{ ary << Foo.new }; puts 'Done'; ary = [] } 

Si ejecuta este con jruby -J-verbose:gc foo.rb, debería ver la GC reclamando regularmente los objetos; esto también es bastante claro usando JVisualVM (el sleep en el ejemplo es para dar un poco de tiempo para conectarse al proceso Jruby en JVisualVM).

Por último, puede aumentar la memoria del montón agregando la siguiente marca: -J-Xmx256m; ver the JRuby wiki para más detalles.

Edit: Coincidentemente, aquí está a mindmap on GC tuning presentado recientemente por Mario Camou en Madrid DevOps relanzado por Nick Sieger.

+0

Merci beaucoup Sébastien. Sus sugerencias fueron muy útiles y nos ayudaron a formular (y responder) más preguntas de las que pensamos. –

+1

El enlace de evernote parece estar muerto ... –

+0

Thans para la respuesta. un ejemplo más: https://gist.github.com/Shobhit1/f4ec5c9f1f47f3b8e70bb7d27a78fba9 – shobhit1

-1

No es posible porque Gc se ejecutará automáticamente por JVM. Asegúrese de crear objetos solo cuando sea necesario. Evite crear objetos de nivel de clase e intente descubrir cuál de los objetos está tomando más memoria y crearlo solo cuando sea necesario.

+0

Eso no es verdad. Tiene algunos consejos de sonido, pero es posible ejecutar GC manualmente. – Overbryd

Cuestiones relacionadas