2009-10-06 21 views
16

al utilizar Jruby, aparece este mensaje.java.lang.OutOfMemoryError: espacio en el montón de Java

Complete Java stackTrace 
java.lang.OutOfMemoryError: Java heap space 

cómo resolver?

+0

Es probable que desee asignar menos objetos en el montón. ¿Puedes publicar un fragmento de código para que podamos entender qué código estás tratando de ejecutar? –

+0

posible duplicado de [Cómo lidiar con el error "java.lang.OutOfMemoryError: Java heap space" (tamaño de almacenamiento dinámico de 64MB)] (http://stackoverflow.com/questions/37335/how-to-deal-with-java- lang-outofmemoryerror-java-heap-space-error-64mb-heap) – Mark

Respuesta

2

puede configurar su almacenamiento dinámico máximo a un tamaño mayor en la línea de comandos:

java -Xmx512m MyClass 
1

O estás perdiendo memoria y lo que necesita para encontrar por qué o que necesita para dar más espacio Java heap:

java -Xmx512m ... 
9

Se puede sintonizar el tamaño del montón de JVM utilizando los -Xmx y -Xms opciones de JVM: -Xmx para el tamaño máximo del montón, y -Xms para el tamaño inicial del almacenamiento dinámico. Por ejemplo:

java -Xms128m -Xmx256m BigApp 

Normalmente utilizo la misma configuración para el tamaño de pila inicial y máxima.

En su caso, es muy difícil decir cómo dimensionar la JVM sin más información sobre lo que está haciendo, cuándo ocurre el problema ... O tal vez solo tiene una pérdida de memoria en algún lugar y aumenta el tamaño del montón ganado No ayuda, solo hará que el problema ocurra más tarde. En este caso, la única solución es arreglar la fuga.

Por último, tenga en cuenta que cuanto más grande es el montón, más largo es el principal GC.

3

Aumentar el tamaño del volcado del montón puede ser solo una curita. Es necesario para generar un volcado de pila añadiendo el argumento adecuado adecuado:

java -XX:+HeapDumpOnOutOfMemoryError -mn256m -mx512 

Esto generará un archivo similar a Java _ * hprof.. A continuación, puede utilizar una gran cantidad de herramientas de código abierto para analizar el volcado de almacenamiento dinámico. Java 1.6 se envía con JHat, que es una especie de buggy y no analiza bien grandes montones. Uso este impresionante plugin de Eclipse: Eclipse Memory Analyzer.

Una vez que se genera un informe del volcado del montón, puede ver qué clases ocupan la mayor cantidad de memoria y puede usarlo como punto de partida para depurar su código y encontrar cualquier fuga de memoria.

17

TLDR: jruby -J-Xmx1024m script_you_want_to_run.rb

Como otros han mencionado, el programa está intentando asignar más memoria que el tamaño máximo se permite la JVM para asignar.

También como han mencionado otros, puede configurar Java para permitir más asignación de memoria diciéndole a través de la línea de comando con el argumento -Xmx1024m (como ejemplo).

-Xmx es el argumento para la memoria máxima, y ​​el 1024m sería el tamaño de la memoria (la m final para megabytes). Creo que JRuby inicia la JVM con una memoria máxima establecida en 512 m, por lo que probablemente querrás ir más allá de eso.

Para enviar los argumentos para la JVM desde la línea de comandos usando jruby, tendrá que añadir -J delante del argumento, por lo que su línea de comandos se verá así:

jruby -J-Xmx1024m script_you_want_to_run.rb 

también acuerde con los sentimientos de pérdida de memoria: si realmente no está lidiando con una tonelada de objetos con la expectativa de que pueda estar viendo este error, entonces es posible que desee considerar la posibilidad de que su programa tenga efectos secundarios no deseados.

1

El mensaje "Java Heap Space" indica que no se pudieron asignar objetos nuevos en el Heap de Java. El error no implica necesariamente una pérdida de memoria de la aplicación. El problema podría ser tan simple como un problema de configuración, donde el tamaño de almacenamiento dinámico especificado (o el tamaño predeterminado, si no se especifica) es insuficiente para la aplicación.

fuentes potenciales de este error y soluciones: http://www.blogsoncloud.com/jsp/techSols/java-lang-OutOfMemoryError-Java-heap-space.jsp

4

comprobar la versión de JVM del jruby con este comando

jruby -v 

Si devuelve esta cadena que significa que está utilizando una JVM de 32 bits, por lo tanto se no se puede establecer el tamaño máximo de almacenamiento dinámico de> = 2 GB

jruby 1.7.3 (1.9.3p385) 2013-02-21 dac429b on Java HotSpot(TM) Client VM 1.6.0_37-b06 [Windows 7-x86] 

Es necesario configurar JAVA_HOME a su versión de 64 bits de Java. p.ej.

set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_09 

Verá siguiente salida si se frota comando jruby -v nuevo

jruby 1.7.3 (1.9.3p385) 2013-02-21 dac429b on Java HotSpot(TM) 64-Bit Server VM 1.7.0_09-b05 [Windows 7-amd64] 

Se puede ver que ahora está utilizando la versión de 64 bits de JVM. Después de que se puede establecer ya sea jruby opta parámetro de entorno de la siguiente manera

set JRUBY_OPTS=-J-Xmx2g 

o puede ejecutar el programa de la siguiente manera

jruby -J-Xmx2g <your ruby program> 
+0

Necesitaba la bandera '-S' también, por ejemplo' jruby -J-Xmx2g -S rails s puma' – Kris

9

Configuración JRUBY_OPTS es la solución que funcionó mejor para mí. Fue mencionado en la respuesta de Koray.

set JRUBY_OPTS=-J-Xmx2g 
0

Me encuentro con un problema similar y no puedo encontrar una solución satisfactoria después de googlear durante unas horas. Si todo lo que necesita es establecer los parámetros Xms y Xmx, esto es lo que funciona para mí:

ps aux | grep java

Averigüe lo que está ejecutando jruby. Mátalo (kill -9 process_id). Vuelva a ejecutar el comando con las opciones nativas de Java en la línea de comando.

Espero que ayude.

Por cierto, estoy usando el servidor puma con Jruby on Rails 4.0, y si alguien conoce una solución más elegante, hágamelo saber. He intentado todo (after_use_hook, .rvmrc, .bashrc, etc. etc.)

Gracias.

+0

¿qué quieres decir con 'native java opción'? – Richardsondx

Cuestiones relacionadas