ejemplo java memory-management heap-memory gentoo

ejemplo - radio button java netbeans



Java no reserva correctamente el tamaƱo de pila inicial enorme (4)

Así que estás llegando aproximadamente a 32 GB como límite. Mientras Oracle habla sobre Compressed oops in the Hotspot JVM , también dice sobre 32GB.

Sin embargo, en un sistema LP64, el montón para cualquier ejecución dada puede tener que ser alrededor de 1.5 veces más grande que para el sistema ILP32 correspondiente (suponiendo que la ejecución se ajuste a ambos modos). Esto se debe al tamaño ampliado de los punteros administrados. La memoria es bastante barata, pero en estos días el ancho de banda y el caché son escasos, por lo que aumentar significativamente el tamaño del montón para superar el límite de 4 Gb es doloroso.

(Además, en los chips x86, el modo ILP32 proporciona la mitad de los registros utilizables que el modo LP64. SPARC no se ve afectado de esta manera; los chips RISC comienzan con muchos registros y solo los amplían para el modo LP64).

Los oops comprimidos representan punteros administrados (en muchos lugares, pero no en todos, en la JVM) como valores de 32 bits que deben escalarse en un factor de 8 y agregarse a una dirección base de 64 bits para encontrar el objeto al que se refieren. Esto permite que las aplicaciones aborden hasta cuatro mil millones de objetos (no bytes), or a heap size of up to about 32Gb.

Enlace aquí

Estoy trabajando en una sola máquina con 512 GB de RAM (dirigida por varias CPU AMD Opteron 6212). Actualmente hay alrededor de 300GB de RAM gratis. Ejecutando un cálculo de Java grande ejecutando

java path/to/myApp -Xms280g -Xmx280g > output.txt

Debería hacer que Java reserve 280GB inmediatamente, y error si falla. Curiosamente, no se produce ningún error pero la top solo muestra un uso de memoria de 30.4GB pero no se bloquea. ¿Cómo puede pasar esto? ¿No se supone que Java se bloquea si no se puede asignar el tamaño del montón inicial?

Y, efectivamente, recibo los errores de límite de sobrecarga de GC / espacio de almacenamiento de OutOfMemory / Java una vez que los 30.4GB están llenos, mucho antes de que se alcancen los 280GB. La ejecución con 250GB o 300GB produce un límite similar de 30.3GB ~ 30.4GB. Estoy ejecutando la máquina virtual OpenJDK de 64 bits con OpenJDK Runtime Environment (IcedTea6) en Gentoo Linux, y hay mucha memoria RAM libre (más de 300 GB).


El orden de los parámetros es incorrecto. Está pasando -Xms280g -Xmx280g como argumentos a su propio programa y no a la JVM. El correcto es:

java -Xms280g -Xmx280g path/to/myApp


Intenta agregar el parámetro -d64 en el cmdline

java -d64 path/to/myApp -Xms280g -Xmx280g > output.txt


Si desea que la memoria especificada en -Xms se capture durante la inicialización de su aplicación, utilice

java -XX: + AlwaysPreTouch -Xms2G -Xmx2G ......

AlwaysPreTouch exigirá cada página de memoria durante la inicialización de la JVM en lugar de simplemente mantener lo que no es necesario como "virtual". Sin embargo, tenga en cuenta que esto tendrá cierta latencia en el inicio de la JVM.

Use el interruptor antes mencionado y luego verifique con la parte superior. Obtendrá 2G completos (de hecho, un poco más) para su JVM.