1. Información general
En este tutorial, aprenderemos la causa del error "No se pudo reservar suficiente espacio para el montón de objetos" , mientras pasamos por algunos escenarios posibles.
2. Síntomas
"No se pudo reservar suficiente espacio para la pila de objetos" es un error específico de JVM que se genera cuando el proceso de Java no puede crear la máquina virtual debido a restricciones de memoria encontradas en el sistema en ejecución:
java -Xms4G -Xmx4G -jar HelloWorld.jar Error occurred during initialization of VM Could not reserve enough space for object heap Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.
Generalmente, hay dos escenarios posibles cuando encontramos el error.
En primer lugar, cuando almorzamos un proceso Java con el parámetro de límite de tamaño máximo de pila ( -Xmx ) y el valor es más de lo que el proceso puede tener en el sistema operativo .
El límite de tamaño de pila varía según varias restricciones:
- arquitectura de hardware (32/64 bit)
- Versión de bit JVM (32/64 bit)
- el sistema operativo que usamos
En segundo lugar, cuando el proceso de Java no puede reservar la cantidad de memoria especificada debido a otras aplicaciones que se ejecutan en el mismo sistema y consumen memoria.
3. Tamaño del montón
El espacio de almacenamiento dinámico de Java es el grupo de asignación de memoria para el programa Java en tiempo de ejecución, administrado por la propia JVM. De forma predeterminada, el grupo de asignación está restringido al tamaño inicial y máximo. Para obtener más información sobre Heap Space en Java, consulte este artículo aquí.
Veamos cuál es el tamaño máximo de pila en diferentes entornos y cómo podemos establecer los límites.
3.1. Tamaño máximo del montón
El límite de almacenamiento dinámico máximo teórico para la JVM de 32 y 64 bits es fácil de determinar al observar el espacio de memoria disponible, 2 ^ 32 (4 GB) para JVM de 32 bits y 2 ^ 64 (16 Exabytes) para 64 bits. bit JVM.
En la práctica, debido a varias limitaciones, el límite puede ser mucho menor y varía según el sistema operativo. Por ejemplo, en los sistemas Windows de 32 bits, el rango máximo de tamaño de pila está entre 1,4 GB y 1,6 GB . Por el contrario, en los sistemas Linux de 32 bits, el tamaño máximo de pila puede extenderse hasta 3 GB.
Por esta razón, si la aplicación requiere un montón grande, deberíamos usar la JVM de 64 bits . Sin embargo, con un montón grande, el recolector de basura tendrá más trabajo que hacer, por lo que es importante encontrar un buen equilibrio entre el tamaño del montón y el rendimiento.
3.2. ¿Cómo controlar los límites de tamaño del montón?
Tenemos dos opciones para controlar los límites de tamaño de pila de una JVM.
Primero, usando parámetros de línea de comandos de Java en cada inicialización de JVM:
-Xms Sets initial Java heap size. This value must be a multiple of 1024 and greater than 1 MB. -Xmx Sets maximum Java heap size. This value must be a multiple of 1024 and greater than 2 MB. -Xmn Sets the initial and maximum size (in bytes) of the heap for the young generation.
Para el valor de tamaño, es posible anexar letra k o K , m o M y g o G para indicar kilobytes, megabytes y gigabytes respectivamente. Si no se especifica ninguna letra, se utiliza la unidad predeterminada (byte).
-Xmn2g -Xmn2048m -Xmn2097152k -Xmn2147483648
En segundo lugar, mediante el uso de la variable de entorno JAVA_OPTS para configurar los parámetros de la línea de comandos de Java de forma global. Debido a esto, cada inicialización de JVM en el sistema utilizará automáticamente las configuraciones establecidas en la variable de entorno.
JAVA_OPTS="-Xms256m -Xmx512m"
Para obtener más información, consulte nuestra guía completa de parámetros de JVM.
4. Conclusión
En este tutorial, analizamos dos posibles escenarios en los que JVM no puede reservar suficiente espacio para el montón de objetos . También aprendimos cómo controlar los límites de tamaño del montón para mitigar este error.
A continuación, obtenga más información sobre posibles problemas de memoria en tiempo de ejecución y cómo identificarlos.