No se pudo reservar suficiente espacio para el montón de objetos

277

Recibo la siguiente excepción repetidamente cada vez que intento ejecutar el programa.

Se produjo un error durante la inicialización de VM

No se pudo reservar suficiente espacio para el montón de objetos

No se pudo crear la máquina virtual de Java.

Traté de aumentar mi memoria virtual (tamaño de página) y el tamaño de RAM, pero fue en vano.

¿Cómo puedo eliminar este error?

Narendra
fuente
2
También recibo este error cuando uso jdk / jre 1.6 en mi máquina virtual, traté de cambiar los valores de configuración dados en los comentarios, pero esto no ayudó, después de actualizar a jdk 1.7 el error desapareció y se aplicaron parámetros Xmx más grandes. Parece que hay muchos cambios con el uso del montón desde java 1.6.
Alexander.Iljushkin

Respuestas:

214

Ejecute la JVM con -XX:MaxHeapSize=512m(o cualquier número grande que necesite) (o -Xmx512mpara abreviar)

Bozho
fuente
42
O el más corto, -mx256m o -mx512m;)
Peter Lawrey
8
¿Es -mx lo mismo que -Xmx y -XX: MaxHeapSize?
Erty Seidohl
19
Gracias ... resulta que un número demasiado grande también podría ser un problema y puede dar el mismo error.
Dinesh Rajan
17
¿Alguien encontró una solución que realmente funciona el 100% del tiempo? Esta solución resuelve el problema temporalmente pero de repente vuelve. Tengo 16 GB de RAM y estoy cansado de esta mierda. Todo fue mejor en los viejos tiempos: [
Nilzor
66
No funciona para mí en Windows 8 con Java x86 o x64.
AndrewSmiley
128

Esto también puede ser causado al configurar algo demasiado grande en un HotSpot vm de 32 bits, por ejemplo:

-Xms1536m -Xmx1536m

donde esto podría / funcionaría:

-Xms1336m -Xmx1336m
djangofan
fuente
55
Olvidé mencionar que este problema tendría que ocurrir al iniciar en un shell de comandos de 32 bits. Un shell de comando de 64 bits puede no tener este problema.
djangofan
Para mí, falló con el valor predeterminado y con un valor demasiado grande, así que asegúrese de probar varios valores. ¡Gracias por la respuesta!
Trax
47

Aquí está cómo solucionarlo:

  • Vaya a Inicio-> Panel de control-> Sistema-> Avanzado (pestaña) -> Variables de entorno-> Sistema

    Variables-> Nuevo: Nombre de la variable: _JAVA_OPTIONS Valor de la -Xmx512M variable: Nombre de la Path
    variable: Valor de la variable:%PATH%;C:\Program Files\Java\jre6\bin;F:\JDK\bin;

Cambie esto a su camino apropiado.

Mohamed Adel
fuente
1
Bastante similar a esta respuesta , diría ...
That1Guy
Bueno Junto con lo anterior, consulte este también. stackoverflow.com/a/9350506/967638
Amarnath
46

Me encontré con esto cuando uso javac, y no parece captar las opciones de línea de comando,

-bash-3.2$ javac -Xmx256M HelloWorldApp.java 
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.

así que la solución aquí es establecer _JAVA_OPTIONS

-bash-3.2$ export _JAVA_OPTIONS="-Xmx256M"
-bash-3.2$ javac HelloWorldApp.java 
Picked up _JAVA_OPTIONS: -Xmx256M

Y esto se compila bien.

Esto me sucede en máquinas con mucha RAM, pero con límites de memoria más bajos. Java decide asignar un gran montón porque detecta el ram en la máquina, pero no está permitido asignarlo debido a ulimits.

Jens Timmerman
fuente
1
+1 para señalar _JAVA_OPTIONS: en mi caso, Java se llama desde algún lugar profundo dentro de un script de shell al que no tengo acceso de escritura, por lo que esta opción es preferible.
Gerrit
Igual que aquí. Estoy usando computadoras de la universidad, así que no soy administrador (no puedo cambiar las variables ambientales) y la opción de línea de comando no funcionaba en absoluto. ¡Muchas gracias!
Kimbluey
38

Java de 32 bits requiere espacio libre contiguo en la memoria para ejecutarse. Si especifica un tamaño de almacenamiento dinámico grande, es posible que no haya mucho espacio libre contiguo en la memoria, incluso si tiene mucho más espacio libre disponible del necesario.

Instalar una versión de Java de 64 bits ayuda en estos casos, los requisitos de memoria contigua solo se aplican a Java de 32 bits.

JohnEye
fuente
1
Creo que esta es la mejor respuesta en caso de que siga recibiendo el error después de usar la opción -Xmx [bignumber] m. Me ayudó a ejecutar Apache jMeter correctamente.
RuudvK
Creé un nuevo proyecto, sin otro código que el de la actividad principal generada automáticamente, y produjo este error
Behelit el
1
Yo segundo @RuudvK. La instalación de 64 bits me permitió aumentar la memoria máxima mientras borraba el error de asignación de memoria. Esta debería ser la respuesta aceptada.
J Weezy
28

En combinación con -Xmx512M, use -d64 para asegurarse de que está ejecutando VM de 64 bits. En una máquina de 64 bits, pensé que estaba ejecutando una máquina virtual de 64 bits, pero no. Después de instalar Java de 64 bits, la opción -d64 funciona y -Xmx permite tamaños de memoria mucho mayores.

java -d64 -Xmx512M mypackage.Test
Axl
fuente
44
Esta respuesta debe estar en la parte superior. Pasé dos meses luchando contra este problema, solo para darme cuenta de que la instalación de Java de 64 bits resolvió el problema (la opción -d64 no era necesaria en mi caso)
Nilzor
Recogido _JAVA_OPTIONS: -d64 -Xmx1024M Opción no reconocida: -d64 No se pudo iniciar la JVM. El tamaño máximo de almacenamiento dinámico (-Xmx) podría ser demasiado grande o una herramienta antivirus o firewall podría bloquear la ejecución.
Alexander
14

Obtuve el mismo error y lo resolví configurándolo en run.conf.bat

Ejecute la JVM con la configuración run.conf.bat en Jboss5x

Si no hay memoria disponible mientras pasa la declaración, realice cambios en run.conf.bat

set "JAVA_OPTS=-Xms512m -Xmx512m -XX:MaxPermSize=256m"
Ankam shyamsundar
fuente
7

Sé que ya hay muchas respuestas aquí, pero ninguna de ellas me ayudó. Al final abrí el archivo /etc/elasticsearch/jvm.optionsy cambié:

-Xms2G
-Xmx2G

a

-Xms256M
-Xmx256M

Eso lo resolvió para mí. Esperemos que esto ayude a alguien más aquí.

kramer65
fuente
7

Tuve problemas similares. Había instalado la versión de 32 bits de Java en una máquina de 64 bits.

Al desinstalar esa versión e instalar la versión de 64 bits de Java. Pude resolver el problema.

Manu Sharma
fuente
6

Supongamos que su clase se llama Testen paquete mypackage. Ejecute su código así:

java -Xmx1024m mypackage.Test

Esto reservará 1024 MB de espacio de almacenamiento dinámico para su código. Si quieres 512 MB, puedes usar:

java -Xmx512m mypackage.Test

Utilice poco m 1024m, 512m, etc.

euforia83
fuente
6

A veces, este error indica que la memoria física y el intercambio en el servidor realmente se utilizan por completo.

Estaba viendo este problema recientemente en un servidor que ejecuta RedHat Enterprise Linux 5.7 con 48 GB de RAM. Descubrí que incluso solo corriendo

java -version

causó el mismo error, lo que estableció que el problema no era específico de mi aplicación.

Corriendo

cat /proc/meminfo

informó que MemFree y SwapFree estaban por debajo del 1% de los valores MemTotal y SwapTotal, respectivamente:

MemTotal:     49300620 kB
MemFree:        146376 kB
...
SwapTotal:     4192956 kB
SwapFree:         1364 kB

Al detener algunas otras aplicaciones en ejecución en la máquina, las cifras de memoria libre aumentaron un poco:

MemTotal:     49300620 kB
MemFree:       2908664 kB
...
SwapTotal:     4192956 kB
SwapFree:      1016052 kB

En este punto, una nueva instancia de Java comenzaría bien y pude ejecutar mi aplicación.

(Obviamente, para mí, esta fue solo una solución temporal; todavía tengo una tarea sobresaliente para hacer un examen más exhaustivo de los procesos que se ejecutan en esa máquina para ver si hay algo que se pueda hacer para reducir los niveles nominales de utilización de memoria, sin tener que recurrir a la detención de las aplicaciones).

Jon Schneider
fuente
Lo mismo aquí, java -versionfallando, a pesar de que la parte superior mostró algo libre todavía: (también se dijo que se produjo un error durante la inicialización de VM. A veces, no se pudo reservar suficiente espacio para la matriz de marcado de tarjetas). La solución parecía ser ejecutar top, buscar qué procesos usaban más RAM (columna VIRT), matarlos [postgres, appdynamics para mí]: |
rogerdpack
¿Podría esto ser debido a la fragmentación de la memoria? Una respuesta anterior menciona el espacio libre contiguo.
Rick Moritz
6

Error:

Para el error, "el error ocurrido durante la inicialización de vm no pudo reservar suficiente espacio para el montón de objetos jboss"

Causa principal :

  • Asignación de memoria inadecuada / insuficiente a nuestra JVM como se menciona a continuación.

  • ej. JAVA_OPTS = "- Xms1303m -Xmx1303m -XX: MaxPermSize = 256m" en jboss-eap-6.2 \ bin \ standalone.conf o "JAVA_OPTS = -Xms1G -Xmx1G -XX: MaxPermSize = 256M" en jboss-eap-6.2 \ bin \ \ standalone.conf.bat que no es más que parámetros de agrupación de asignación de memoria JVM.

Resolución:

  • Aumentar el tamaño del montón. Para aumentar el tamaño del montón,
  • goto -> jboss-eap-6.2 \ bin \ standalone.conf.bat o jboss-eap-6.2 \ bin \ standalone.conf
  • cambiar -> JAVA_OPTS = "- Xms256m -Xmx512m -XX: MaxPermSize = 256m" donde -Xms es el tamaño mínimo de almacenamiento dinámico y -Xmx es el tamaño máximo de almacenamiento dinámico.
  • Generalmente no se recomienda tener el mismo tamaño para min y max

  • Si está ejecutando su aplicación desde eclipse,

  • Haga doble clic en el servidor.
  • seleccione 'abrir configuración de inicio', será redirigido a la ventana 'Editar propiedades de configuración de inicio'.
  • En esta ventana, vaya a la pestaña '(x) = Argumentos'.
  • En VM Arguments, defina el tamaño de su montón como se menciona a continuación.
  • "-Dprogram.name = JBossTools: JBoss EAP 6.1+ Runtime Server" -server -Xms256m -Xmx512m -XX: MaxPermSize = 256m -Dorg.jboss.resolver.warning = true
Prabhakar
fuente
Una cita de la Referencia de la línea de comandos de Oracle : " Para obtener el mejor rendimiento, establezca -Xms en el mismo tamaño que el tamaño máximo de almacenamiento dinámico, por ejemplo:java -Xgcprio:throughput -Xmx:64m -Xms:64m myApp "
user1438038
3

Recientemente me enfrenté a este problema. Tengo 3 aplicaciones Java que comienzan con un tamaño de almacenamiento dinámico de 1024m o 1280m. Java está mirando el espacio disponible en el intercambio, y si no hay suficiente memoria disponible, la jvm se cierra.

Para resolver el problema, tuve que finalizar varios programas que tenían una gran cantidad de memoria virtual asignada.

Estaba corriendo en x86-64 linux con una jvm de 64 bits.

codeDr
fuente
3

Tenía la cantidad correcta de configuraciones de memoria, pero para mí estaba usando un intellij de 64 bits con jvm de 32 bits. Una vez que cambié a VM de 64 bits, el error desapareció.

vsingh
fuente
2

Suponiendo que tiene suficiente memoria libre y configura correctamente sus argumentos de JVM, es posible que tenga un problema de fragmentación de la memoria. Verifique la memoria máxima de Java en Windows XP .

daramasala
fuente
2

Si está ejecutando JVM de 32 bits, cambiar el tamaño de almacenamiento dinámico a un valor más pequeño probablemente ayudaría. Puede hacerlo pasando argumentos a Java directamente o mediante variables de entorno como las siguientes,

java -Xms128M -Xmx512M
JAVA_OPTS="-Xms128M -Xmx512M"

Para JVM de 64 bits, un tamaño de almacenamiento dinámico mayor -Xms512M -Xmx1536Mdebería funcionar.

Ejecute java -versiono java -d32, java--d64para que Java7 compruebe qué versión está ejecutando.

h - n
fuente
1

De todos modos, aquí está cómo solucionarlo: vaya a Inicio-> Panel de control-> Sistema-> Avanzado (pestaña) -> Variables de entorno-> Variables del sistema-> Nuevo: Nombre de la variable: _JAVA_OPTIONS Valor de la variable: -Xmx512M

O

Cambie la llamada de hormiga como se muestra a continuación.

   <exec
        **<arg value="-J-Xmx512m" />**
    </exec>

Funcionó para mi.

Sudhakar
fuente
1

Se produjo un error durante la inicialización de VM No se pudo reservar suficiente espacio para el montón de objetos 1572864KB

Cambié el valor de la memoria en el archivo settings.grade 1536 a 512 y ayudó

Haris Durrani
fuente
1

Vaya a Inicio-> Panel de control-> Sistema-> Avanzado (pestaña) -> Variables de entorno-> Variables de sistema-> Nuevo:

Variable name: _JAVA_OPTIONS
Variable value: -Xmx512M
El mehdi AZROUR
fuente
Establecer esto globalmente limita el tamaño de almacenamiento dinámico que puede darle a IntelliJ.
user3056052
0

En caso de que esté ejecutando un programa java: - ejecute su programa en una terminal usando el comando correcto para Linux, sería 'java -jar myprogram.jar' y agregue -Xms256m -Xmx512m, por ejemplo: 'java -jar myprogram.jar Xms256m -Xmx512m '

En caso de que esté ejecutando un script .sh (linux, mac?) O un script .bat (windows), abra el script y busque las opciones de Java si están presentes y aumente la memoria.

Si todo lo anterior no funciona, verifique sus procesos (ctrl + alt + delete en windows) (ps aux en linux / mac) y elimine los procesos que usan mucha memoria y no son necesarios para su sistema operativo. => Intente volver a ejecutar su programa.

Fico
fuente
0

En CASSANDRA_HOME / bin / cassandra.bat encontrarás la siguiente configuración

REM JVM Opts we'll use in legacy run or installation
set JAVA_OPTS=-ea^
 -javaagent:"%CASSANDRA_HOME%\lib\jamm-0.3.0.jar"^
 -Xms**2G**^
 -Xmx**2G**^

Puede reducir 2G a un número menor, por ejemplo, 1G o incluso menor, y debería funcionar.

Lo mismo si está ejecutando en unix box, cambie el archivo .sh adecuadamente.

Deepak Singhvi
fuente
0

Obtuve el mismo error y se resolvió cuando eliminé los archivos temporales usando% temp% y reiniciando eclipse.

Viswanath Nuggu
fuente
0

A veces se relaciona como

$ sysctl vm.overcommit_memory
vm.overcommit_memory = 2

Si lo configura a:

$ sysctl vm.overcommit_memory=0

Deberia de funcionar.

kay
fuente
0

Reemplace -Xmx2Gcon -Xms512Mo cualquier tamaño de memoria mayor en el archivo cassandra.bat en el directorio bin de cassandra.

kiran
fuente
0

Abra el archivo gradle.properties en la carpeta de Android.

Reemplace esta línea:

org.gradle.jvmargs=-Xmx1536M

con:

org.gradle.jvmargs=-Xmx512m

Explicación: Límite máximo del documento de Gradle:

Si el entorno de compilación solicitado no especifica un tamaño de almacenamiento dinámico máximo, el Daemon usará hasta 512 MB de almacenamiento dinámico.

vive el amor
fuente
-2

No es necesario hacer nada, solo intercambiar en el archivo POM como se muestra a continuación

<configuration>
    <maxmemory>1024M</maxmemory>
</configuration>
Harish
fuente
2
¿Quién dijo algo sobre un archivo POM?
Henley Chiu