¿Cuál es el tamaño de montón máximo predeterminado para la JVM de Sun desde Java SE 6?

¿Cuál es el tamaño de montón máximo predeterminado para la JVM de Sun desde Java SE 6 (es decir, equivalente a establecer -Xmx)?

Parece que Java SE 5 con una máquina de clase servidor, es

Más pequeño de 1/4 de la memoria física o 1 GB.

Pregunta de bonificación: parece que para la JVM de IBM se la puede pedir

java -verbose:sizes -version 

¿Puedes preguntarle a JVM de Sun?

Editar :

Utilicé Runtime.getRuntime (). MaxMemory para confirmar min (memoria física / 4, 1G), a la que se hace referencia en la documentación de Sun.

java 1.6.0_21 o posterior, o eso …

 $ java -XX:+PrintFlagsFinal -version 2>&1 | grep MaxHeapSize uintx MaxHeapSize := 12660904960 {product} 

Parece que el mínimo (1G) ha sido eliminado.

O en Windows usando findstr

 C:\>java -XX:+PrintFlagsFinal -version 2>&1 | findstr MaxHeapSize 

Uno puede preguntar con algún código de Java:

 long maxBytes = Runtime.getRuntime().maxMemory(); System.out.println("Max memory: " + maxBytes / 1024 / 1024 + "M"); 

Ver javadoc .

Con JDK, también puede usar jinfo para conectarse a la JVM para el en cuestión y obtener el valor de MaxHeapSize:

 jinfo -flag MaxHeapSize  

A partir de JDK6U18 siguientes son configuraciones para el tamaño del montón.

En la JVM del cliente, la configuración predeterminada del montón de Java se ha modificado para mejorar el rendimiento de las aplicaciones de cliente enriquecido actuales. Los tamaños de almacenamiento dynamic inicial y máximo son más grandes y los ajustes relacionados con la recolección de basura generacional están mejor ajustados.

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. Esta cantidad es de al menos 8 megabytes y, de lo contrario, 1/64 de la memoria física hasta un tamaño de memoria física de 1 gigabyte.

Fuente: http://www.oracle.com/technetwork/java/javase/6u18-142093.html

Una forma es si tiene un jdk instalado, en la carpeta bin hay una utilidad llamada jconsole (incluso se puede usar visualvm). Inicie y conéctese al proceso java correspondiente y podrá ver cuáles son las configuraciones de tamaño de almacenamiento dynamic y muchos otros detalles

Al ejecutar headless o cli solamente, jConsole se puede utilizar en LAN, si especifica un puerto para conectarse al iniciar el servicio en cuestión.

Para responder a esta pregunta, es fundamental si Java VM está en modo CLIENTE o SERVIDOR. Puede especificar las opciones “-cliente” o “-servidor”. De lo contrario, Java usa reglas internas; básicamente win32 siempre es cliente y Linux es siempre servidor, pero vea la tabla aquí:

http://docs.oracle.com/javase/6/docs/technotes/guides/vm/server-class.html

Sun / Oracle jre6u18 doc dice re client: la VM obtiene 1/2 de memoria física si la máquina tiene <= 192MB; 1/4 de memoria si la máquina tiene <= 1Gb; max 256Mb. En mi prueba en un sistema Windows XP de 32 bits con phys mem 2Gb, Java asignó 256Mb, lo que concuerda con el documento.

Sun / Oracle jre6u18 doc dice re server: igual que el cliente, luego agrega un lenguaje confuso: para JVM de 32 bits, el máximo predeterminado es 1Gb, y para JVM de 64 bits el valor predeterminado es 32Gb. En mi prueba en una máquina Linux de 64 bits con 8 Gb física, Java asigna 2 Gb, que es 1/4 de física; en una máquina de Linux de 64 bits con 128 GB de Java física asigna 32 Gb, de nuevo 1/4 de física.

Gracias a esta publicación SO por guiarme:

La definición de máquina de clase servidor ha cambiado recientemente?