java.lang.OutOfMemoryError: espacio de stack de Java

Recibo el siguiente error en la ejecución de un progtwig de subprocesos múltiples

java.lang.OutOfMemoryError: Java heap space 

El error anterior ocurrió en uno de los hilos.

  1. Hasta donde sé, el espacio de Heap está ocupado solo por variables de instancia. Si esto es correcto, entonces por qué ocurrió este error después de ejecutarlo bien por algún tiempo ya que el espacio para las variables de instancia se asigna en el momento de la creación del objeto.

  2. ¿Hay alguna manera de boost el espacio de montón?

  3. ¿Qué cambios debería hacer en mi progtwig para que ocupe menos espacio en el montón?

Si desea boost su espacio de java -Xms -Xmx dynamic, puede usar java -Xms -Xmx en la línea de comando. Por defecto, 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 crear un perfil de su aplicación para averiguar por qué se está consumiendo su tamaño de stack. NetBeans tiene un muy buen perfilador incluido con él. Creo que usa el jvisualvm debajo del capó. Con un generador de perfiles, puede tratar de encontrar dónde se crean muchos objetos, cuándo se recogen los objetos extraídos y más.

1.- Sí, pero se refiere a la memoria completa utilizada por su progtwig.

2.- Sí, ver opciones de Java VM

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

Es decir

java -Xmx2g asigna 2 gigabytes de RAM como máximo a tu aplicación

Pero deberías ver si primero no tienes una pérdida de memoria.

3.- Depende del progtwig. Intente detectar memory leaks. Esta pregunta sería difícil de responder. Últimamente puede hacer un perfil utilizando JConsole para tratar de averiguar dónde va su memoria

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

He encontrado que es útil usar visualgc para ver 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 rellenó, por lo tanto visualgc, ya que es posible que desee cambiar la parte que tiene un problema, en lugar de simplemente decir,

¡Multa! Daré 1G de RAM a la JVM.

Intenta ser más preciso acerca de lo que estás haciendo; a la larga, probablemente encontrarás el progtwig mejor para él.

Para determinar dónde puede estar la pérdida de memoria, puede usar pruebas unitarias para eso, probando qué era la memoria antes de la prueba y después, y si hay un cambio demasiado grande, entonces es posible que desee examinarlo, pero necesita haga el control mientras su prueba aún se está ejecutando.

Para boost el tamaño del almacenamiento dynamic, puede usar el argumento -Xmx al iniciar Java; p.ej

 -Xmx256M 

Puedes obtener el tamaño de tu memoria Heap por debajo del progtwig.

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

luego, en consecuencia, puede boost el tamaño del almacenamiento dynamic también utilizando: java -Xmx2g http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

  1. En la mayoría de los casos, el código no está optimizado. Libera esos objetos que crees que no se necesitarán más. Evita la creación de objetos en tu loop cada vez. Intenta usar cachés. No sé cómo va tu aplicación. Pero en la progtwigción, también se aplica una regla de vida normal

    Es mejor prevenir que curar. “No crees objetos innecesarios”

  1. Hasta donde sé, el espacio de Heap está ocupado solo por variables de instancia. Si esto es correcto, entonces por qué ocurrió este error después de ejecutarlo bien por algún tiempo ya que el espacio para las variables de instancia se asigna 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 en la memoria del montón.

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

  1. ¿Hay alguna manera de boost el espacio de montón?

Sí. Eche un vistazo a este artículo de oracle para más detalles.

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

-Xms: que establece el tamaño de stack inicial y mínimo

-Xmx: que establece el tamaño máximo de almacenamiento dynamic

  1. ¿Qué cambios debería hacer en mi progtwig para que ocupe menos espacio en el montón?

Depende de su aplicación.

  1. Establezca la memoria de almacenamiento dynamic máxima según el requisito de su aplicación

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

  3. Si encuentra pérdidas 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, corrija las filtraciones.

Notas importantes del artículo de Oracle

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

Posibles razones:

  1. Configuración incorrecta (no asigna suficiente memoria)
  2. La aplicación mantiene involuntariamente referencias a objetos y esto evita que los objetos sean recolectados.
  3. Aplicaciones que hacen un uso excesivo de finalizadores. Si una clase tiene un método de finalización, los objetos de ese tipo no recuperarán su espacio en el momento de la recolección de elementos no utilizados. Si el hilo del finalizador no puede seguir el ritmo, con la cola de finalización, 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 entender G1GC

  1. Las variables locales se encuentran en la stack. El espacio de montón está ocupado por objetos.

  2. Puede usar la opción -Xmx .

  3. Básicamente, el espacio de stack se usa cada vez que asigna un nuevo objeto con new y se libera un tiempo después de que ya no se haga referencia al objeto. Por lo tanto, asegúrese de no mantener referencias a los objetos que ya no necesita.

No, creo que estás pensando en el espacio de stack. El espacio de montón está ocupado por objetos. La forma de boostlo es -Xmx256m, reemplazando el 256 con la cantidad que necesita en la línea de comando.

En netbeans, ir a la barra de herramientas ‘Ejecutar’, -> ‘Establecer configuración del proyecto’ -> ‘Personalizar’ -> ‘ejecutar’ de su ventana emergente -> ‘Opción de VM’ -> rellenar ‘-Xms2048m -Xmx2048m ‘. Podría resolver el problema del tamaño del montón.