En la documentación de 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 tiempo de ejecución según la configuración del sistema.
¿Qué significa la configuración del sistema ?
-Xmx
, al menos en Java 8, porque en mi sistema Linux de 64 bits, con una memoria total de 6 Gb, tengo un jvm que tiene -Xmx = 1,5 Gb, de forma predeterminada.Respuestas:
Varía en la aplicación y la versión, pero por lo general depende de la máquina virtual utilizado (por ejemplo, cliente o servidor, ver
-client
y-server
parámetros) y en la memoria del sistema.A menudo,
client
el valor predeterminado es 1/4 de su memoria física o 1 GB (lo que sea menor).Además, las opciones de configuración de Java (parámetros de la 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, laJAVA_TOOL_OPTIONS
variable de entorno es verificada por todas las herramientas de Java y se usa si existe (más detalles aquí y aquí ).Puede ejecutar el siguiente comando para ver los valores predeterminados:
Te da una lista muuuuy larga,
-Xmx
está adentroMaxHeapSize
,-Xms
está adentroInitialHeapSize
. Filtre su salida (por ejemplo,|grep
en linux) o guárdela en un archivo para que pueda buscar en él.fuente
java -XX:+PrintCommandLineFlags
para imprimir los tamaños de pila (y otra información) elegidos por la JVM en función de la información del sistema actual-XX:+PrintFlagsFinal
el que sugirió no me funciona. Agregándolo a la respuesta.-XX:+PrintFlagsFinal
es la mejor opción ya que debería mostrar toda la información después de que todo se haya tenido en cuenta (incluidas las opciones manuales y la ergonomía). Aunque-XX:+PrintCommandLineFlags
parece funcionar en mi JVM (podría depender de la versión exacta)java -XX:+PrintFlagsFinal -version | grep HeapSize
Como ha mencionado, el valor predeterminado
-Xmxsize
(Tamaño máximo de pila) depende de la configuración de su sistema.Java8
client
toma más de 1/64 de su memoria física para suXmssize
(tamaño mínimo de pila) y más pequeño de 1/4 de su memoria física para su-Xmxsize
(tamaño máximo de pila).Lo que significa que si tiene una memoria física de 8 GB de RAM, tendrá una
Xmssize
mayor de 8 * (1/6) y una menor de-Xmxsize
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 anular a la cantidad deseada.
fuente
Sorprendentemente, esta pregunta no tiene una respuesta documentada definitiva. Quizás otro punto de datos proporcionaría valor a otros que buscan una respuesta. En mis sistemas que ejecutan CentOS (6.8,7.3) y Java 8 (compilació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 a STDERR, por lo que el comando para determinar la memoria predeterminada actual presentada por otros anteriores debe ajustarse a lo siguiente: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}
fuente
En mi Ubuntu VM, con 1048 MB de RAM total,
java -XX:+PrintFlagsFinal -version | grep HeapSize
impreso:,uintx MaxHeapSize := 266338304
que es aproximadamente 266 MB y es 1/4 de mi RAM total.fuente
Al 8 de mayo de 2019:
El tamaño del montón de JVM depende de la configuración del sistema, lo que significa:
a) cliente jvm vs servidor jvm
b) 32 bits frente a 64 bits .
Enlaces:
1) actualización de J2SE5.0: https://docs.oracle.com/javase/6/docs/technotes/guides/vm/gc-ergonomics.html
2) respuesta breve: https://docs.oracle.com/ javase / 8 / docs / technotes / guides / vm / gctuning / ergonomics.html
3) respuesta detallada: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html# default_heap_size
4) cliente vs servidor: https://www.javacodegeeks.com/2011/07/jvm-options-client-vs-server.html
Resumen: (Es difícil de entender a partir de los enlaces anteriores. Resumirlos aquí)
1) El tamaño de pila máximo predeterminado para Client jvm es 256mb (hay una excepción, lea los enlaces anteriores).
2) El tamaño de pila máximo predeterminado para el servidor jvm de 32 bits es de 1 GB y el de 64 bits es de 32 GB (de nuevo, también hay excepciones aquí. Por favor, lea eso en los enlaces).
Así máximo predeterminado tamaño de almacenamiento dinámico de JVM es: 256 MB o 1 GB o 32 GB , dependiendo de VM, arriba.
fuente