Si omito la -Xmxn
opción de la línea de comandos de Java, se utilizará un valor predeterminado. De acuerdo con la documentación de Java
"el valor predeterminado se elige en tiempo de ejecución en función de la configuración del sistema"
¿Qué ajustes de configuración del sistema influyen en el valor predeterminado?
java
heap
heap-memory
Richard Dorman
fuente
fuente
Respuestas:
En Windows, puede usar el siguiente comando para averiguar los valores predeterminados en el sistema donde se ejecutan sus aplicaciones.
Busque las opciones
MaxHeapSize
(para-Xmx
) yInitialHeapSize
para-Xms
.En un sistema Unix / Linux, puedes hacer
Creo que la salida resultante está en bytes.
fuente
InitialHeapSize = 262803264
yMaxHeapSize = 4206886912
que es de aproximadamente 256 MB y 4 GB si no me equivoco. ¿Esto significa que cada JVM comienza como si se iniciara con-Xms256m -Xmx4g
opciones?java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
-version
suprime el texto largo de "uso"stderr
.Para Java SE 5: según la recolección de basura Ergonomía [Oracle] :
ACTUALIZAR:
Como señaló Tom Anderson en su comentario, lo anterior es para máquinas de clase de servidor. De Ergonomía en la máquina virtual 5.0 JavaTM :
fuente
Java 8 lleva más de 1 / 64º de la memoria física para su xmssize (TamañoPila mínimo) y menos de 1 / cuarto de la memoria física para su -Xmxsize (Máximo TamañoPila).
Puede verificar el tamaño predeterminado del almacenamiento dinámico Java mediante:
En Windows :
En Linux :
La memoria física de la máquina y la versión Java.
fuente
Esto se cambió en la actualización 18 de Java 6 .
Suponiendo que tenemos más de 1 GB de memoria física (bastante común en estos días), siempre es 1/4 de su memoria física para el servidor vm.
fuente
greater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
Ernesto tiene razón. Según el enlace que publicó [1]:
[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html
fuente
Para IBM JVM, el comando es el siguiente:
Para obtener más información sobre IBM SDK para Java 8: http://www-01.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/appendixes/defaults.html ? lang = es
fuente
¡Finalmente!
A partir de Java 8u191 ahora tiene las opciones:
que se puede usar para dimensionar el montón como un porcentaje de la RAM física utilizable. (que es lo mismo que la RAM instalada menos lo que usa el núcleo).
Consulte las Notas de la versión de Java8 u191 para obtener más información. Tenga en cuenta que las opciones se mencionan bajo un encabezado de Docker, pero de hecho se aplican si se encuentra en el entorno de Docker o en un entorno tradicional.
El valor predeterminado para
MaxRAMPercentage
es 25%. Esto es extremadamente conservador.Mi propia regla: si su host está más o menos dedicado a ejecutar la aplicación java dada, entonces puede aumentar drásticamente sin problemas. Si está en Linux, solo ejecuta daemons estándar y ha instalado RAM desde alrededor de 1 Gb o más, entonces no dudaría en usar el 75% para el montón de JVM. Nuevamente, recuerde que este es el 75% de la RAM disponible , no la RAM instalada . Lo que queda son los otros procesos de aterrizaje de usuario que pueden ejecutarse en el host y los otros tipos de memoria que necesita la JVM (por ejemplo, para la pila). En conjunto, esto generalmente encajará bien en el 25% que queda. Obviamente, con aún más RAM instalada, el 75% es una apuesta cada vez más segura. (Me gustaría que la gente de JDK hubiera implementado una opción en la que podría especificar una escalera)
Establecer la
MaxRAMPercentage
opción se ve así:Tenga en cuenta que estos valores porcentuales son de tipo 'doble' y, por lo tanto, debe especificarlos con un punto decimal. Obtiene un error un tanto extraño si usa "75" en lugar de "75.0".
fuente
Echa un vistazo a la página de documentación .
Tamaños predeterminados iniciales y máximos de almacenamiento dinámico de JVM del cliente:
El tamaño de almacenamiento dinámico máximo predeterminado es la mitad de la memoria física hasta un tamaño de memoria física de 192 megabytes (MB) y, de lo contrario, un cuarto de la memoria física hasta un tamaño de memoria física de 1 gigabyte (GB) .
Tamaños predeterminados iniciales y máximos de almacenamiento dinámico de JVM del servidor:
En las JVM de 32 bits, el tamaño de almacenamiento dinámico máximo predeterminado puede ser de hasta 1 GB si hay 4 GB o más de memoria física . En JVM de 64 bits, el tamaño de almacenamiento dinámico máximo predeterminado puede ser de hasta 32 GB si hay 128 GB o más de memoria física
Puede especificar los tamaños de almacenamiento dinámico inicial y máximo utilizando los indicadores -Xms (tamaño de almacenamiento dinámico inicial) y -Xmx (tamaño de almacenamiento dinámico máximo). Si sabe cuánto montón necesita su aplicación para funcionar bien, puede establecer -Xms y -Xmx en el mismo valor
fuente
El
Xms
yXmx
son bandera de la máquina virtual Java (JVM):Xms
:initial and minimum
JVMheap size
Format
:-Xmx<size>[g|G|m|M|k|K]
Default Size
:-server
modo: 25% de memoria física libre,> = 8 MB y <= 64 MB-client mode
: 25% de memoria física libre,> = 8 MB y <= 16 MBTypical Size
:-Xms128M
-Xms256M
-Xms512M
Function
/Effect
:Xms
memoria de tamañoXmx
:maximum
JVMheap size
Format
:-Xmx<size>[g|G|m|M|k|K]
Default Size
:<= R27.2
Windows
:75%
de memoria física total hasta1GB
Linux/Solaris
:50%
de memoria física disponible hasta1GB
>= R27.3
Windows X64
:75%
de memoria física total hasta2GB
Linux/Solaris X64
:50%
de memoria física disponible hasta2GB
Windows x86
:75%
de memoria física total hasta1GB
Linux/Solaris X86
:50%
de memoria física disponible hasta1GB
Typical Size
:-Xmx1g
-Xmx2084M
-Xmx4g
-Xmx6g
-Xmx8g
Function
/Effect
:Xmx
tamaño máximoXmx
, voluntadjava.lang.OutOfMemoryError
OutOfMemoryError
?Xmx
valor-Xmx4g
a-Xmx8g
Mas detalle
ver documento oficial: -X Opciones de línea de comandos
fuente
Varios parámetros afectan el tamaño de la generación. El siguiente diagrama ilustra la diferencia entre el espacio comprometido y el espacio virtual en el montón. En la inicialización de la máquina virtual, se reserva todo el espacio para el montón. El tamaño del espacio reservado se puede especificar con la
-Xmx
opción Si el valor del-Xms
parámetro es menor que el valor del-Xmx
parámetro, no todo el espacio reservado se compromete inmediatamente en la máquina virtual. El espacio no comprometido se etiqueta como "virtual" en esta figura. Las diferentes partes del montón (generación permanente, generación permanente y generación joven) pueden crecer hasta el límite del espacio virtual según sea necesario.De manera predeterminada, la máquina virtual aumenta o reduce el montón en cada colección para tratar de mantener la proporción de espacio libre para los objetos vivos en cada colección dentro de un rango específico. Este rango objetivo se establece como un porcentaje por los parámetros -
XX:MinHeapFreeRatio=<minimum>
y-XX:MaxHeapFreeRatio=<maximum>
, y el tamaño total está limitado por debajo-Xms<min>
y por arriba por-Xmx<max>
.Parámetro Valor predeterminado
MinHeapFreeRatio 40
MaxHeapFreeRatio 70
-Xms 3670k
-Xmx 64m
Los valores predeterminados de los parámetros de tamaño de almacenamiento dinámico en sistemas de 64 bits se han ampliado en aproximadamente un 30%. Este aumento está destinado a compensar el mayor tamaño de los objetos en un sistema de 64 bits.
Con estos parámetros, si el porcentaje de espacio libre en una generación cae por debajo del 40%, la generación se expandirá para mantener el 40% de espacio libre, hasta el tamaño máximo permitido de la generación. Del mismo modo, si el espacio libre supera el 70%, la generación se contratará de modo que solo el 70% del espacio sea libre, sujeto al tamaño mínimo de la generación.
Las aplicaciones de servidores grandes a menudo experimentan dos problemas con estos valores predeterminados. Uno es el inicio lento, porque el montón inicial es pequeño y debe redimensionarse en muchas colecciones importantes. Un problema más acuciante es que el tamaño de almacenamiento dinámico máximo predeterminado es irracionalmente pequeño para la mayoría de las aplicaciones de servidor. Las reglas generales para las aplicaciones de servidor son:
En general, aumente la memoria a medida que aumenta el número de procesadores, ya que la asignación puede ser paralela.
Ahí está el artículo completo.
fuente