Recibo el siguiente error al ejecutar un programa de subprocesos múltiples
java.lang.OutOfMemoryError: Java heap space
El error anterior ocurrió en uno de los hilos.
Hasta donde yo sé, el espacio de montón está ocupado solo por variables de instancia. Si esto es correcto, entonces por qué se produjo este error después de funcionar bien durante algún tiempo, ya que el espacio, por ejemplo, las variables se asignan en el momento de la creación del objeto.
¿Hay alguna forma de aumentar el espacio del montón?
¿Qué cambios debo hacer en mi programa para que ocupe menos espacio en el montón?
java
multithreading
out-of-memory
heap-memory
Yatendra Goel
fuente
fuente
Respuestas:
Si desea aumentar su espacio de pila, puede usarlo
java -Xms<initial heap size> -Xmx<maximum heap size>
en la línea de comando. De forma predeterminada, los valores se basan en la versión de JRE y la configuración del sistema. Puede obtener más información sobre las opciones de VM en el sitio web de Java .Sin embargo, recomendaría perfilar su aplicación para averiguar por qué se está consumiendo el tamaño de su montón. NetBeans tiene un generador de perfiles muy bueno incluido. Creo que usa
jvisualvm
debajo del capó. Con un generador de perfiles, puede intentar encontrar dónde se están creando muchos objetos, cuándo se recolectan los objetos basura y más.fuente
1.- Sí, pero se refiere básicamente a toda la memoria que usa tu programa.
2.- Sí ver opciones Java VM
Es decir
java -Xmx2g
asigne 2 gigabytes de RAM como máximo a su aplicaciónPero primero debería ver si no tiene una pérdida de memoria.
3.- Depende del programa. Intente detectar fugas de memoria. Esta pregunta sería muy difícil de responder. Últimamente puedes crear un perfil usando JConsole para tratar de averiguar a dónde va tu memoria
fuente
Es posible que desee consultar este sitio para obtener más información sobre la memoria en la JVM: http://developer.streamezzo.com/content/learn/articles/optimization-heap-memory-usage
Me ha resultado útil usar visualgc para observar cómo se llenan las diferentes partes del modelo de memoria, para determinar qué cambiar.
Es difícil determinar qué parte de la memoria se llenó, por lo tanto, visualgc, ya que es posible que desee cambiar la parte que tiene un problema, en lugar de simplemente decir:
Trate de ser más preciso sobre lo que está haciendo, a la larga probablemente encontrará el programa mejor para ello.
Para determinar dónde puede estar la pérdida de memoria, puede usar pruebas unitarias para eso, probando cuál era la memoria antes y después de la prueba, y si hay un cambio demasiado grande, es posible que desee examinarlo, pero debe realice la comprobación mientras la prueba aún se está ejecutando.
fuente
Para aumentar el tamaño del montón, puede usar el argumento -Xmx al iniciar Java; p.ej
fuente
Puede obtener el tamaño de la memoria del montón a través del siguiente programa.
luego, en consecuencia, puede aumentar el tamaño del montón también usando: java -Xmx2g http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
fuente
Eso significa que está creando más objetos en su aplicación durante un período de tiempo de forma continua. Los nuevos objetos se almacenarán en la memoria del montón y esa es la razón del crecimiento en la memoria del montón.
Heap 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 hace referencia al objeto en su aplicación)
Si. Eche un vistazo a este artículo de Oracle para obtener más detalles.
Hay dos parámetros para configurar el tamaño del montón:
-Xms : , que establece el tamaño de pila inicial y mínimo
-Xmx : , que establece el tamaño máximo del montón
Depende de su aplicación.
Establezca la memoria de pila máxima según los requisitos de su aplicación
No provoque pérdidas de memoria en su aplicación
Si encuentra fugas de memoria en su aplicación, busque la causa raíz con la ayuda de herramientas de creación de perfiles como MAT , Visual VM , jconsole , etc. Una vez que encuentre la causa raíz, repare las fugas.
Notas importantes del artículo de Oracle
Posibles razones:
En una nota diferente, use mejores algoritmos de recolección de basura ( CMS o G1GC )
Eche un vistazo a esta pregunta para comprender G1GC
fuente
En la mayoría de los casos, el código no está optimizado. Suelta aquellos objetos que crees que no serán necesarios más. Evite la creación de objetos en su bucle cada vez. Intenta usar cachés. No sé cómo le va a su aplicación. Pero en programación, también se aplica una regla de la vida normal
Es mejor prevenir que curar. "No crees objetos innecesarios"
fuente
Las variables locales se encuentran en la pila. El espacio de la pila está ocupado por objetos.
Puede utilizar la
-Xmx
opción.Básicamente, el espacio de pila se usa cada vez que asigna un nuevo objeto
new
y se libera algún tiempo después de que ya no se hace referencia al objeto. Así que asegúrese de no guardar referencias a objetos que ya no necesita.fuente
No, creo que estás pensando en el espacio de la pila. El espacio de la pila está ocupado por objetos. La forma de aumentarlo es -Xmx256m, reemplazando el 256 con la cantidad que necesita en la línea de comando.
fuente
Para evitar esa excepción, si está utilizando JUnit y Spring, intente agregar esto en cada clase de prueba:
fuente
En netbeans, vaya a la barra de herramientas 'Ejecutar', -> 'Establecer configuración del proyecto' -> 'Personalizar' -> 'ejecutar' de su ventana emergente -> 'Opción VM' -> completar '-Xms2048m -Xmx2048m '. Podría resolver el problema del tamaño del montón.
fuente