- 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.
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)
- ¿Hay alguna forma de aumentar el espacio del montó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
- ¿Qué cambios debo hacer en mi programa para que ocupe menos espacio en el 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
Causa: el mensaje de detalle Espacio de almacenamiento dinámico de Java indica que el objeto no se pudo asignar en el almacenamiento dinámico de Java. Este error no implica necesariamente una pérdida de memoria.
Posibles razones:
- Configuración incorrecta (no asigna suficiente memoria)
- La aplicación contiene involuntariamente referencias a objetos y esto evita que los objetos se recolecten como basura
- 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 tienen su espacio recuperado en el momento de la recolección de basura. Si el subproceso del finalizador no puede mantenerse al día con la cola de finalización, entonces el montón de Java podría llenarse y se lanzaría este tipo de excepción OutOfMemoryError .
En una nota diferente, use mejores algoritmos de recolección de basura ( CMS o G1GC )
Eche un vistazo a esta pregunta para comprender G1GC