Pregunta

Recibo el siguiente error al ejecutar un programa multiproceso

java.lang.OutOfMemoryError: Java heap space

El error anterior ocurrió en uno de los hilos.

  1. Hasta donde yo sé, el espacio del montón está ocupado únicamente por variables de instancia.Si esto es correcto, entonces ¿por qué se produjo este error después de ejecutarse bien durante algún tiempo, ya que se asigna espacio, por ejemplo, a las variables en el momento de la creación del objeto?

  2. ¿Hay alguna forma de aumentar el espacio del montón?

  3. ¿Qué cambios debo hacer en mi programa para que ocupe menos espacio en el montón?

¿Fue útil?

Solución

Si desea aumentar su espacio de almacenamiento dinámico, puede utilizar java -Xms<initial heap size> -Xmx<maximum heap size> en la línea de comandos. Por defecto, los valores se basan en la versión y la configuración del sistema de JRE. Puede averiguar más sobre las opciones de VM en el sitio web de Java .

Sin embargo, yo recomendaría el perfil de su aplicación para averiguar por qué el tamaño de la pila se está comiendo. NetBeans tiene un muy buena perfilador incluido con él. Creo que utiliza el jvisualvm bajo el capó . Con un generador de perfiles, puede tratar de encontrar donde se están creando muchos objetos, cuando los objetos reciben el recolector de basura, y mucho más.

Otros consejos

1.- Sí, pero más o menos se refiere a toda la memoria utilizada por el programa.

2.- Sí ver las opciones de Java VM

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size

Ie

java -Xmx2g asignar 2 gigabytes de memoria RAM como máximo a su aplicación

Sin embargo, usted debe ver si usted no tiene una pérdida de memoria en primer lugar.

3.- Depende del programa. Trate de pérdidas de memoria al contado. Esta cuestión sería difícil de responder. Últimamente puede perfilar utilizando JConsole para tratar de averiguar cuál es su memoria va a

Es posible que desee ver en este sitio para aprender más acerca de la memoria en la JVM: http://developer.streamezzo.com/content/learn/articles / optimización en heap-memoria-uso

He encontrado que es útil el uso de visualgc para ver cómo el diferentes partes del modelo de memoria se está llenando, para determinar qué cambio.

Es difícil determinar qué parte de la memoria se llena, por lo tanto, visualgc, ya que es posible que desee cambiar sólo la parte que está teniendo un problema, en lugar de simplemente decir,

  

Bella! Voy a dar 1G de RAM para la JVM.

Trate de ser más preciso sobre lo que está haciendo, a la larga, es probable que encontrar el programa mejor para él.

Para determinar dónde la pérdida de memoria puede ser que usted puede utilizar las pruebas unitarias para que, mediante pruebas de lo que era la memoria antes de la prueba, y después, y si hay un cambio demasiado grande, entonces es posible que desee examinarlo, pero, que tiene que hacer el cheque, mientras que la prueba sigue en funcionamiento.

Para aumentar el tamaño de la pila puede utilizar el argumento -Xmx al iniciar Java; por ejemplo.

-Xmx256M

Puede obtener el tamaño de la pila de memoria a través de abajo programe.

public class GetHeapSize {
    public static void main(String[] args) {
        long heapsize = Runtime.getRuntime().totalMemory();
        System.out.println("heapsize is :: " + heapsize);
    }
} 

A continuación, en consecuencia se puede aumentar el tamaño del montón también mediante el uso de: java -Xmx2g http://www.oracle.com/technetwork/java /javase/tech/vmoptions-jsp-140102.html

  1. Hasta donde yo sé, el espacio del montón está ocupado únicamente por variables de instancia.Si esto es correcto, entonces ¿por qué se produjo este error después de ejecutarse bien durante algún tiempo, ya que se asigna espacio, por ejemplo, a las variables en el momento de la creación del objeto?

Eso significa que está creando más objetos en su aplicación durante un período de tiempo continuo.Los nuevos objetos se almacenarán en la memoria del montón y esa es la razón del crecimiento de la memoria del montón.

El montón no solo contiene variables de instancia.Almacenará todos los tipos de datos no primitivos (Objetos).La vida útil de estos objetos puede ser corta (bloque de método) o larga (hasta que se haga referencia al objeto en su aplicación)

  1. ¿Hay alguna forma de aumentar el espacio del montón?

Sí.Echa un vistazo a este oráculo. artículo para más detalles.

Hay dos parámetros para configurar el tamaño del montón:

-Xms:, que establece el tamaño de montón inicial y mínimo

-Xmx:, que establece el tamaño máximo del montón

  1. ¿Qué cambios debo hacer en mi programa para que ocupe menos espacio en el montón?

Depende de su aplicación.

  1. Establezca la memoria de almacenamiento dinámico máxima según los requisitos de su aplicación

  2. No provoque pérdidas de memoria en su aplicación

  3. Si encuentra pérdidas de memoria en su aplicación, encuentre la causa raíz con la ayuda de herramientas de creación de perfiles como ESTERA, Máquina virtual visual , jconsola etc.Una vez que encuentre la causa raíz, solucione las fugas.

Notas importantes de Oracle artículo

Causa:El mensaje detallado de espacio en el montón de Java indica que el objeto no se pudo asignar en el montón de Java.Este error no implica necesariamente una pérdida de memoria.

Posibles razones:

  1. Configuración incorrecta (no asignar suficiente memoria)
  2. La aplicación contiene involuntariamente referencias a objetos y esto evita que los objetos se recopilen como basura
  3. Aplicaciones que hacen un uso excesivo de finalizadores.Si una clase tiene un método de finalización, entonces los objetos de ese tipo no recuperan su espacio en el momento de la recolección de basura. Si el subproceso finalizador no puede seguir el ritmo de la cola de finalización, entonces el montón de Java podría llenarse y se generaría este tipo de excepción OutOfMemoryError..

En una nota diferente, utilice mejores algoritmos de recolección de basura ( CMS o G1GC)

Echa un vistazo a esto pregunta para entender G1GC

  1. En la mayoría de los casos, el código no está optimizado. Suelta a esos objetos que usted piensa que no se necesitaba más. Evitar la creación de objetos en su bucle cada vez. Trate de usar cachés. No sé cómo se encuentra tu solicitud. Pero en la programación, una regla de vida normal se aplica, así

    La prevención es mejor que curar. "No crear objetos innecesarios"

  1. Las variables locales están situados en la pila. espacio de almacenamiento dinámico está ocupada por objetos.

  2. Puede utilizar la opción -Xmx.

  3. Básicamente espacio de almacenamiento dinámico se agota cada vez que asignar un nuevo objeto con new y liberó algún tiempo después de que el objeto ya no se hace referencia. Así que asegúrese de que usted no mantiene referencias a objetos que ya no necesite.

No, creo que usted está pensando en espacio de pila. espacio de almacenamiento dinámico está ocupada por objetos. La manera de aumentar es -Xmx256m, en sustitución del 256 con la cantidad que necesita en la línea de comandos.

En NetBeans, vaya a 'Ejecutar' barra de herramientas, -> 'Set Configuración del proyecto' -> 'Personalizar' -> 'run' de su aparecido Windo -> 'Opción VM' -> rellene '-Xms2048m -Xmx2048m'. Podría resolver el problema de tamaño de la pila.

Para evitar esa excepción, si está utilizando JUnit y primavera intente agregar esto en cada clase de prueba:

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top