java - diferencia - memoria stack
¿Qué sucede si especifica un tamaño máximo de pila mayor que la RAM disponible? (3)
Preguntado en una entrevista. ¿Qué sucede si especifica el tamaño máximo de almacenamiento dinámico (Xmx) mayor que la RAM disponible? También me pregunto qué sucede si especifica un tamaño mínimo de pila (Xms) mayor que la RAM disponible.
Nada dramático
Aunque puede suceder con ciertos sistemas integrados de gama baja, en estos días sería bastante raro ver un entorno Java no virtual incluso integrado en un escritorio o servidor imposible.
Por lo tanto, no sucedería nada dramático, pero una vez que use la memoria RAM disponible, la asignación de memoria adicional (virtual) solo retrasará innecesariamente la recuperación (recolección de basura) y hará que el programa inicie la paging .
Si es grave, esta condición se llama " thrashing " y no es algo bueno. Las cosas correrían despacio.
La forma más fácil de averiguarlo es probarlo y ver.
Editar: En realidad, hay al menos dos respuestas a la pregunta. Probablemente en un sistema de 64 bits, como se mencionó, su aplicación podría crecer y crecer en el uso de la memoria y comenzar a agitarse. En un sistema de 32 bits, la historia es un poco diferente porque el sistema operativo no puede darle tanto espacio de almacenamiento dinámico. Por ejemplo, si ejecuto una aplicación en Windows XP con java de 32 bits con la opción de línea de comando -Xmx2000m, morirá con un mensaje similar al siguiente:
Tamaño máximo de pila no válido: -Xmx2000m
El tamaño especificado excede el tamaño máximo representable.
No se pudo crear la máquina virtual de Java.
En Linux con java de 32 bits, obtengo lo siguiente con -Xmx3000m:
No se pudo crear la máquina virtual de Java.
Se produjo un error durante la inicialización de VM
No se pudo reservar suficiente espacio para el montón de objetos
En Linux con java de 32 bits, obtengo lo siguiente con -Xmx6000m
Tamaño máximo de pila no válido: -Xmx6000m
El tamaño especificado excede el tamaño máximo representable.
No se pudo crear la máquina virtual de Java.
Al intentar esto con Java de 64 bits, la JVM le permite asignar más memoria que la RAM física, aunque si solicita una cantidad extremadamente grande de memoria, la jvm volverá a fallar con un error.
Solo si su -Xms (mínimo) es más grande que la memoria disponible, obtendrá un error inmediato en la inicialización de la JVM
$>java -Xms100g #JVM fails to start
Error occurred during initialization of VM Could not
reserve enough space for object heap
Si su - Xmx (máximo) es más grande que la memoria disponible, su JVM se inicializa ya que todavía no está usando la memoria
$>java -Xmx100g #JVM starts up fine
Usage: java [-options] class [args...]
...
Si su -Xmx (máximo) es más grande que la memoria disponible (la memoria total para incluir cualquier memoria virtual), se producirá una falla en el tiempo de ejecución si y solo si sus procesos de JVM intentan usar más memoria de la que tiene la máquina.
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f5feb100000, 927465472, 0) failed; error=''Cannot allocate memory'' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 927465472 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /some/file/path/hs_err_pid25.log
No lo hará hasta que se acerque a su límite de -Xmx, pero si ese límite está por encima de su memoria disponible, obtendrá el error de asignación de memoria anterior y su programa terminará antes de que se considere la posibilidad de la paliza. (Y eso es muy dramático!)