Solución: se produjo un error durante la inicialización de la máquina virtual que no pudo reservar suficiente espacio para el montón de objetos

Aunque los subprogramas Java no son una tecnología web popular en estos días, existen innumerables razones para implementar una máquina virtual Java directamente en un servidor Linux. Si intenta ejecutar el comando java de Linux directamente, ya sea en hardware discreto o dentro de su propia máquina virtual, es posible que obtenga un mensaje de "error ocurrido durante la inicialización de la máquina virtual no se pudo reservar suficiente espacio para el montón de objetos".

Esto probablemente parezca bastante extraño porque lo más probable es que tenga suficiente RAM para ejecutar el comando, pero se debe en gran parte a una peculiaridad específica en la forma en que se utilizan las páginas de memoria física y virtual. Especificar algunos tamaños relativamente grandes debería permitirle omitir por completo este mensaje y ejecutar el comando java como lo haría con cualquier otro.

Método 1: uso de las opciones de la línea de comandos

Si ha intentado ejecutar java y ha recibido este mensaje, probablemente ya haya ejecutado el comando gratuito para asegurarse de que haya suficiente memoria para ejecutar el programa.

java y comandos gratuitos

Tenga en cuenta que en nuestra máquina de prueba teníamos unos 2,3 GB de RAM física y aún no se había utilizado una sola página de memoria virtual. Si nota que tiene una contracción de la memoria, entonces querrá cerrar otras cosas que tiene en ejecución antes de volver a intentarlo. Por otro lado, aquellos que encontraron que tienen mucha memoria libre pueden intentar especificar un tamaño directamente.

Por ejemplo, en nuestra máquina pudimos ejecutar el comando como java -Xms256m -Xmx512M y funcionó como se esperaba. Esto limita el tamaño de la pila que la máquina virtual Java intenta reservar al inicio. Dado que una máquina virtual sin restricciones podría hipotéticamente hacer cosas inusuales, podría arrojar mensajes de error en un sistema que de otro modo sería libre. También es posible que desee jugar con esos dos valores antes de encontrar la combinación correcta.

Esto puede ser un problema independientemente de en qué lo esté ejecutando, ya que la JVM no tiene nada que ver con el tipo de VM que pueda estar usando para ejecutar GNU / Linux.

Método 2: exportar las variables para hacer que el cambio sea permanente

Cuando encuentre un valor que funcione, puede exportarlo para que sea permanente para esa sesión. Por ejemplo, usamos export _JAVA_OPTIONS = '- Xms256M -Xmx512M' desde el símbolo del sistema de bash y nos permitió ejecutar el comando java por sí mismo sin ninguna otra opción hasta que cerramos la sesión de nuestro servidor.

Debía ejecutarse nuevamente cuando iniciamos sesión en otra sesión, por lo que es posible que desee agregarlo a cualquier script de inicio relevante si planea usar el comando java con bastante frecuencia. Agregamos la línea a nuestro archivo .bash_login y pareció funcionar cada vez que usamos un indicador de inicio de sesión sin tener que ejecutarlo nuevamente, aunque es posible que tenga que buscar otra ubicación si está trabajando con un shell diferente.

Es posible que haya notado que solo ciertas configuraciones de hardware activan este mensaje de error. Esto se debe a que suele suceder en máquinas con una gran cantidad de RAM física pero con menores límites de uso. Java intentará asignar un bloque enorme solo para que le digan que no puede, lo que interpreta como quedarse sin memoria.

Método 3: Impresión de las opciones actuales de Java

Si ha estado trabajando en la línea de comando y desea una referencia rápida a lo que ha establecido actualmente el valor de _JAVA_OPTIONS, simplemente ejecute echo $ _JAVA_OPTIONS e inmediatamente imprimirá los valores actuales. Esto es útil para solucionar problemas cuando está tratando de averiguar los números correctos para probar.

Tenga en cuenta que si bien esta solución no debería requerir ningún otro juego, Java arrojará el mensaje "No se pudo reservar suficiente espacio para el montón de objetos" si alguna vez se encuentra realmente en el extremo corto de la memoria virtual. Si este es el caso, entonces querrá volver a verificar qué procesos se están ejecutando actualmente y posiblemente reiniciar el servidor si esa es una opción. También puede crear más espacio de intercambio, pero si esto es un problema, generalmente es mejor intentar corregirlo de alguna otra manera.

En el raro caso de que su configuración parezca correcta pero aún no funcione, asegúrese de haber instalado el paquete Java de 64 bits, ya que debería ser inmune a este problema. Los requisitos de memoria contigua solo se aplican a la versión de 32 bits de Java. Encontramos en un puñado de casos que la versión de 64 bits intentó crear una máquina virtual de 32 bits, por lo que especificar la opción -d64 en la línea de comandos nos solucionó.