tda - java.lang.OutOfMemoryError: espacio de pila de Java
que es una cola en java (10)
Recibo el siguiente error en la ejecución de un programa de subprocesos múltiples
java.lang.OutOfMemoryError: Java heap space
El error anterior ocurrió en uno de los hilos.
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.
¿Hay alguna manera de aumentar el espacio de montón?
¿Qué cambios debería hacer en mi programa para que ocupe menos espacio en el montón?
- 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)
- ¿Hay alguna manera de aumentar el espacio de montón?
Sí. Eche un vistazo a este article oráculo para más detalles.
Hay dos parámetros para establecer 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 de almacenamiento dinámico
- ¿Qué cambios debería hacer en mi programa para que ocupe menos espacio en el montón?
Depende de su aplicación.
Establezca la memoria de almacenamiento dinámico máxima según el requisito de su aplicación
No cause pérdidas de memoria en su aplicación
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 article 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:
- Configuración incorrecta (no asigna suficiente memoria)
- La aplicación mantiene involuntariamente referencias a objetos y esto evita que los objetos sean recolectados.
- 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 question para entender G1GC
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 programación, también se aplica una regla de vida normal
Es mejor prevenir que curar. "No crees objetos innecesarios"
Las variables locales se encuentran en la pila. El espacio de montón está ocupado por objetos.
Puede usar la opción
-Xmx
.Básicamente, el espacio de pila 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.
1.- Sí, pero se refiere a la memoria completa utilizada por su programa.
2.- Sí, ver opciones de Java VM
-Xms<size> set initial Java heap size
-Xmx<size> 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 programa. Intente detectar fugas de memoria. Esta pregunta sería difícil de responder. Últimamente puede hacer un perfil utilizando JConsole para tratar de averiguar dónde va su memoria
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.
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 visualgc 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 programa 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.
No, creo que estás pensando en el espacio de pila. El espacio de montón está ocupado por objetos. La forma de aumentarlo es -Xmx256m, reemplazando el 256 con la cantidad que necesita en la línea de comando.
Para aumentar el tamaño del almacenamiento dinámico, puede usar el argumento -Xmx al iniciar Java; p.ej
-Xmx256M
Puedes obtener el tamaño de tu memoria Heap por debajo del programa.
public class GetHeapSize {
public static void main(String[] args) {
long heapsize = Runtime.getRuntime().totalMemory();
System.out.println("heapsize is :: " + heapsize);
}
}
luego, en consecuencia, puede aumentar el tamaño del almacenamiento dinámico también utilizando: java -Xmx2g http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
Si desea aumentar su espacio de java -Xms<initial heap size> -Xmx<maximum heap size>
dinámico, puede usar java -Xms<initial heap size> -Xmx<maximum heap size>
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 pila. 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.