java.lang.OutOfMemoryError: espacio del montón de Java

Resuelto Amit asked hace 15 años • 12 respuestas

Recibo el siguiente error al ejecutar un programa multiproceso

java.lang.OutOfMemoryError: Java heap space

El error anterior ocurrió en uno de los hilos.

  1. 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?

  2. ¿Hay alguna forma de aumentar el espacio del montón?

  3. ¿Qué cambios debo hacer en mi programa para que ocupe menos espacio en el montón?

Amit avatar Oct 21 '09 00:10 Amit
Aceptado

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 jvisualvmdebajo 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.

Thomas Owens avatar Oct 20 '2009 17:10 Thomas Owens

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 -Xmx2gasigne 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.

OscarRyz avatar Oct 20 '2009 17:10 OscarRyz

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.

James Black avatar Oct 20 '2009 17:10 James Black

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

user2663609 avatar Dec 18 '2013 11:12 user2663609