Xmxsize predeterminado en Java 8 (tamaño máximo de pila)

81

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 ?

Vitaly
fuente
1
Significa que si su sistema tiene 16 GB de RAM, el tamaño será mayor que si tuviera 512 MB.
JB Nizet
Gracias, ¿cuánto más grande?
Vitaly
Busque el "tamaño máximo de pila" aquí
Nir Alfasi
3
>> Más pequeño de 1/4 de la memoria física o 1GB. Gracias, @alfasin.
Vitaly
4
@Vitaly El límite de 1 Gb parece no ser válido -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.
Trump 2020 - La justicia llegará el

Respuestas:

144

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 -clienty -serverparámetros) y en la memoria del sistema.

A menudo, clientel 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, la JAVA_TOOL_OPTIONSvariable 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:

java -XX:+PrintFlagsFinal -version

Te da una lista muuuuy larga, -Xmxestá adentro MaxHeapSize, -Xmsestá adentro InitialHeapSize. Filtre su salida (por ejemplo, |grepen linux) o guárdela en un archivo para que pueda buscar en él.

icza
fuente
11
Como una pequeña adición, puede ejecutar java -XX:+PrintCommandLineFlagspara imprimir los tamaños de pila (y otra información) elegidos por la JVM en función de la información del sistema actual
Cristian Vat
1
@CristianVat Sí, pero el parámetro es que -XX:+PrintFlagsFinalel que sugirió no me funciona. Agregándolo a la respuesta.
icza
Correcto, lo siento -XX:+PrintFlagsFinales 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:+PrintCommandLineFlagsparece funcionar en mi JVM (podría depender de la versión exacta)
Cristian Vat
2
Para cajas grandes, esta regla de "1/4 de RAM" definitivamente no es válida. En un servidor de 4 sockets, 64 gb por socket (es decir, 256 gb de RAM), Xmx tiene por defecto ~ 32 gb. 32gb también puede estar relacionado con las limitaciones de CompressedOops en este punto.
FauxFaux
2
Esto solo imprime líneas relacionadas con el tamaño del montón:java -XX:+PrintFlagsFinal -version | grep HeapSize
Trump 2020 - La justicia llegará el
37

Como ha mencionado, el valor predeterminado -Xmxsize(Tamaño máximo de pila) depende de la configuración de su sistema.

Java8 clienttoma más de 1/64 de su memoria física para su Xmssize(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 Xmssizemayor de 8 * (1/6) y una menor de -Xmxsize8 * (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.

Sarat Chandra
fuente
docs.oracle.com/javase/8/docs/technotes/guides/vm/… según este enlace, el valor predeterminado para mínimo / inicial es 1/64 no 1/6. "Más grande de 1/64 de la memoria física de la máquina en la máquina o un mínimo razonable"
Vyshnav Ramesh Thrissur
15

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:+PrintFlagsFinalimprime 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}
BrianNotBob
fuente
En mi sistema con 16 Gb de RAM: 2069889024 = 2 Gb.
david.perez
Windows 7 de 64 bits con 8 GB de RAM: JVM de 32 bits: 256 MB, JVM de 64 bits: 2 GB
golimar
Finalmente encontré la documentación para ello: stackoverflow.com/a/56036202/32453
rogerdpack
2

En mi Ubuntu VM, con 1048 MB de RAM total, java -XX:+PrintFlagsFinal -version | grep HeapSizeimpreso:, uintx MaxHeapSize := 266338304que es aproximadamente 266 MB y es 1/4 de mi RAM total.

Binita Bharati
fuente
2
Me parece que OpenJDK y Oracle tienen características diferentes: veo que OpenJDK usa 1/4 de RAM como -Xmx en todo momento (nunca el más pequeño de 1/4 y 1GB)
pogul
1

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.

Vyshnav Ramesh Thrissur
fuente
1
Finalmente enlaces a documentos reales que explican lo que está sucediendo.
rogerdpack