¿Cómo se determina el tamaño predeterminado del montón de Java?

Si omito la opción -Xmxn de la línea de comandos de Java, se usa un valor predeterminado. Según la documentación de Java, “el valor predeterminado se elige en el tiempo de ejecución en función de la configuración del sistema”.

¿Qué configuración de configuración del sistema influye en el valor predeterminado?

En sistemas Windows, puede usar el siguiente comando para averiguar los valores predeterminados en el sistema donde se ejecutan sus aplicaciones.

java -XX: + PrintFlagsFinal -version | findstr HeapSize

Busque las opciones MaxHeapSize (para -Xmx ) e InitialHeapSize para -Xms .

En un sistema Unix / Linux, puedes hacer

java -XX: + PrintFlagsFinal -version | grep HeapSize

Creo que la salida resultante está en bytes.

De acuerdo con Garbage Collector Ergonomics [Oracle] :

tamaño de stack inicial:

Más grande de 1/64 de la memoria física de la máquina en la máquina o un mínimo razonable. Antes de J2SE 5.0, el tamaño del montón inicial predeterminado era un mínimo razonable, que varía según la plataforma. Puede anular este valor predeterminado utilizando la opción de línea de comandos -Xms.

tamaño máximo de almacenamiento dynamic

Más pequeño de 1/4 de la memoria física o 1 GB. Antes de J2SE 5.0, el tamaño de almacenamiento dynamic máximo predeterminado era 64 MB. Puede anular este valor predeterminado utilizando la opción de línea de comandos -Xmx.

ACTUALIZAR:

Como señaló Tom Anderson en su comentario, lo anterior es para máquinas de clase servidor. Desde la ergonomía en la máquina virtual JavaTM 5.0 5.0 :

En la plataforma J2SE versión 5.0, una clase de máquina denominada máquina de clase servidor se ha definido como una máquina con

  • 2 o más procesadores físicos
  • 2 o más Gbytes de memoria física

con la excepción de las plataformas de 32 bits que ejecutan una versión del sistema operativo Windows. En todas las demás plataformas, los valores predeterminados son los mismos que los valores predeterminados para la versión 1.4.2.

En la plataforma J2SE versión 1.4.2 de forma predeterminada, se realizaron las siguientes selecciones

  • tamaño de almacenamiento inicial de 4 Mbyte
  • tamaño máximo de almacenamiento dynamic de 64 Mbyte

Esto se cambia con Java 6 actualización 18 .

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.

Ernesto tiene razón Según el enlace que publicó [1]:

Configuración actualizada del montón JVM del cliente

En el cliente JVM …

  • El tamaño máximo de almacenamiento dynamic predeterminado es la mitad de la memoria física hasta un tamaño de memoria física de 192 megabytes y, de otro modo, una cuarta parte de la memoria física hasta un tamaño de memoria física de 1 gigabyte.

    Por ejemplo, si su máquina tiene 128 megabytes de memoria física, entonces el tamaño máximo de almacenamiento dynamic es de 64 megabytes, y mayor o igual a 1 gigabyte de memoria física, lo que da como resultado un tamaño de almacenamiento máximo de 256 megabytes.

  • JVM no usa realmente el tamaño máximo de almacenamiento dynamic a menos que el progtwig cree suficientes objetos para requerirlo. Una cantidad mucho más pequeña, denominada tamaño de almacenamiento dynamic inicial, se asigna durante la inicialización de JVM. …

  • La ergonomía de la configuración del montón JVM del servidor ahora es la misma que la del Cliente, excepto que el tamaño máximo predeterminado para las JVM de 32 bits es de 1 gigabyte , correspondiente a un tamaño de memoria física de 4 gigabytes, y para las JVM de 64 bits es de 32 gigabytes , a un tamaño de memoria física de 128 gigabytes.

[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html

el valor predeterminado se elige en el tiempo de ejecución en función de la configuración del sistema

Echa un vistazo a la página de documentación

Tamaño de almacenamiento predeterminado

A menos que los tamaños de montón inicial y máximo se especifiquen en la línea de comando, se calculan en función de la cantidad de memoria en la máquina.

  1. Tamaños inicial y máximo de almacenamiento por defecto de JVM del cliente:

    El tamaño máximo de almacenamiento dynamic predeterminado es la mitad de la memoria física hasta un tamaño de memoria física de 192 megabytes (MB) y, de otro modo, una cuarta parte de la memoria física hasta un tamaño de memoria física de 1 gigabyte (GB) .

  2. Tamaños iniciales y máximos de almacenamiento por defecto de JVM del servidor:

    En las JVM de 32 bits, el tamaño de almacenamiento dynamic máximo predeterminado puede ser de hasta 1 GB si hay 4 GB o más de memoria física . En las JVM de 64 bits, el tamaño de almacenamiento dynamic máximo predeterminado puede ser de hasta 32 GB si hay 128 GB o más de memoria física

¿Qué configuración de configuración del sistema influye en el valor predeterminado?

Puede especificar los tamaños de stack inicial y máxima usando los indicadores -Xms (tamaño de stack inicial) y -Xmx (tamaño máximo de stack). Si sabe cuánto montón necesita su aplicación para funcionar bien, puede establecer -Xms y -Xmx con el mismo valor

Para IBM JVM, el comando es el siguiente:

 java -verbose:sizes -version 

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 = en

Java 8 toma más de 1/6 parte de su memoria física para su Xmssize (Minimum HeapSize) y menos de 1/4 parte de su memoria física para -Xmxsize (Maximum HeapSize).

Puede verificar el tamaño de stack Java predeterminado por:

En Windows :

 java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize" 

En Linux :

 java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize' 

¿Qué configuración de configuración del sistema influye en el valor predeterminado?

Su memoria física y su versión de Java.