java.lang.OutOfMemoryError: espacio del montón de Java
Recibo el siguiente error al ejecutar un programa multiproceso
java.lang.OutOfMemoryError: Java heap space
El error anterior ocurrió en uno de los hilos.
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?
¿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?
Si desea aumentar su espacio de almacenamiento dinámico, 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 crear un perfil de su aplicación para descubrir por qué se está consumiendo el tamaño de su montón. NetBeans tiene incluido un muy buen generador de perfiles . Creo que usa jvisualvm
debajo del capó. Con un generador de perfiles, puede intentar encontrar dónde se crean muchos objetos, cuándo se recolecta la basura de los objetos y más.
1.- Sí, pero se refiere prácticamente a toda la memoria que utiliza tu 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
asigne 2 gigabytes de RAM como máximo a su aplicación
Pero primero deberías ver si no tienes una pérdida de memoria.
3.- Depende del programa. Intente detectar pérdidas de memoria. Esta pregunta sería demasiado difícil de responder. Últimamente puedes crear un perfil usando JConsole para intentar averiguar a dónde va tu 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 ( enlace de archivo de Internet )
Me ha resultado útil utilizar visualgc para observar cómo se llenan las diferentes partes del modelo de memoria y determinar qué cambiar.
Es difícil determinar qué parte de la memoria se llenó, por lo tanto visualgc, ya que es posible que desees simplemente cambiar la parte que tiene el problema, en lugar de simplemente decir:
¡Bien! Le daré 1G de RAM a la JVM.
Intenta ser más preciso con lo que estás haciendo; a la larga probablemente encontrarás 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 verificación mientras la prueba aún se está ejecutando.
Puede obtener el tamaño de su memoria dinámica a través del siguiente programa.
public class GetHeapSize {
public static void main(String[] args) {
long heapsize = Runtime.getRuntime().totalMemory();
System.out.println("heapsize is :: " + heapsize);
}
}
luego, en consecuencia, también puede aumentar el tamaño del montón usando: java -Xmx2g http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html