Tamaño Xmx predeterminado en Java 8

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.