Comprender el tamaño máximo de almacenamiento dynamic de JVM: 32 bits frente a 64 bits

He leído que el tamaño máximo de almacenamiento dynamic en Windows de 32 bits es ~ 1.5GB, lo que se debe al hecho de que la JVM requiere memoria contigua. ¿Alguien puede explicar el concepto de “memoria contigua” y por qué solo tiene un máximo de 1.5 GB en Windows?

En segundo lugar, ¿cuál es el tamaño máximo de almacenamiento dynamic en Windows de 64 bits y por qué es diferente de lo que está disponible en 32 bits?

La parte de 32 bits / 64 bits no está relacionada con Java

Resulta que las ubicaciones de memoria en un sistema de 32 bits son referenciadas por enteros sin signo de 32 bits. Esto permite hasta 2 ^ 32 ubicaciones de memoria posibles. Como cada ubicación almacena 1 byte, obtienes 2 ^ 32 bytes o 4 GB si así lo prefieres.

En un sistema de 64 bits hay 2 ^ 64 ubicaciones, o 16 exabytes.

Ahora, en Windows, la parte contigua se convierte en un gran problema, pero así es como Windows hace las cosas. La idea es que necesites un rango completo “ininterrumpido” para tu montón. Lamentablemente, Windows asigna algo de memoria en algún lugar en el medio. Esto básicamente te deja con la mitad del lado izquierdo o la mitad del lado derecho, alrededor de 1.5-2GB, para asignar tu montón.

Vea esta pregunta para más detalles sobre 32 vs 64 bit.

Editar: ¡Gracias mrjoltcola por el prefijo exa!

Contiguo simplemente significa “sin espacios”, un solo segmento largo. La cantidad está limitada por el tamaño del segmento que el sistema operativo puede asignar a su proceso. Si Java requiere un montón contiguo o no es un problema de implementación específico de JVM y puede no existir para otras máquinas virtuales.

La memoria contigua no es el problema que limita las ventanas para usar solo 1.2 GB de heap. Aunque se definió el montón mínimo / máximo, JVM ocuparía el máximo almacenamiento dynamic de la memoria del sistema durante el arranque. A continuación, hará referencia solo a un montón mínimo dentro de la memoria del sistema ocupado hasta que tenga que expandirse. Se requiere memoria contigua de la stack máxima para iniciar JVM en la mayor parte de la implementación para mejorar el rendimiento.

Como explicó Marcus anteriormente, el límite de hardware de 32 bits es de 4 GB para un único proceso (hilo). Todos los sistemas operativos abordan este 4GB de manera diferida. 4 GB se divide principalmente como espacio de kernel y espacio de usuario. En ventanas de 32 bits, el espacio máximo de usuario es cercano a 1,5 GB. Hay una opción para iniciar ventanas con el modificador / 3GB para tener más espacio de usuario.