En la documentación del oracle encontré:
-Xmxsize Especifica el tamaño máximo (en bytes) del grupo de asignación de memoria en bytes … El valor predeterminado se elige en el tiempo de ejecución en función de la configuración del sistema.
¿Qué significa la configuración del sistema ?
Varía según la implementación y la versión, pero por lo general depende de la VM utilizada (por ejemplo, cliente o servidor, vea los parámetros -client
y -server
) y en la memoria de su sistema.
A menudo, su valor predeterminado es 1/4 de su memoria física o 1 GB (la que sea menor).
Además, las opciones de configuración de Java (parámetros de línea de comandos) se pueden “subcontratar” a variables de entorno, incluido el -Xmx
, que puede cambiar el valor predeterminado (es decir, especificar un nuevo valor predeterminado). Específicamente, la variable de entorno JAVA_TOOL_OPTIONS
es comprobada por todas las herramientas de Java y utilizada si existe (más detalles aquí y aquí ).
Puede ejecutar el siguiente comando para ver los valores predeterminados:
java -XX:+PrintFlagsFinal -version
Te da una lista de -Xmx
, -Xmx
está en MaxHeapSize
, -Xms
está en InitialHeapSize
. Filtra tu salida (ej. |grep
en linux) o guárdala en un archivo para que puedas buscar en ella.
Como ha mencionado, el valor predeterminado -Xmxsize
(Maximum HeapSize) depende de la configuración de su sistema.
Java8 toma más de 1/6 de su memoria física para su Xmssize
(Minimum HeapSize) y más pequeña de 1/4 de su memoria física para su -Xmxsize
(Maximum HeapSize).
Lo que significa que si tiene una memoria física de 8 GB de RAM, tendrá Xmssize
como mayor de 8 * (1/6) y menor de -Xmxsize
como 8 * (1/4).
Puede verificar su HeapSize predeterminado con
En Windows :
java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
En Linux :
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Estos valores predeterminados también se pueden sobrescribir a su cantidad deseada.
Sorprendentemente, esta pregunta no tiene una respuesta documentada definitiva. Quizás otro punto de datos podría proporcionar valor a otros que buscan una respuesta. En mis sistemas con CentOS (6.8.7.3) y Java 8 (comstackción 1.8.0_60-b27, servidor de 64 bits):
la memoria predeterminada es 1/4 de la memoria física, no limitada por 1 GB.
Además, -XX:+PrintFlagsFinal
imprime en STDERR para que el comando para determinar la memoria predeterminada actual presentada por los demás se modifique de la siguiente manera:
java -XX:+PrintFlagsFinal 2>&1 | grep MaxHeapSize
Lo siguiente se devuelve en el sistema con 64 GB de RAM física:
uintx MaxHeapSize := 16873684992 {product}
En mi Ubuntu VM, con 1048 MB de RAM total, java -XX:+PrintFlagsFinal -version | grep HeapSize
java -XX:+PrintFlagsFinal -version | grep HeapSize
impreso: uintx MaxHeapSize := 266338304
, que es aproximadamente 266 MB y es 1/4 de mi RAM total.