2010-03-16 13 views
33

Tengo read el tamaño de almacenamiento dinámico máximo en Windows de 32 bits es ~ 1.5GB debido a 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?Descripción del tamaño máximo de almacenamiento dinámico de JVM: 32 bits frente a 64 bits

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

+2

El límite para cualquier JVM de 32 bits en un sistema operativo de 32 bits varía de aproximadamente 1,2 GB (algunas versiones de Windows) a 2,0 GB (Solaris). El jvm de 32 bits en Solaris de 64 bits puede obtener 4 GB. Creo que el máximo de 64 bits jvm en Windows de 64 bits es de 32 GB. – Seth

+0

Hubiera esperado una JVM de 32 bits en una Win7 de 64 bits para poder obtener también 4GB, pero ese no es el caso, son esos 1.5GB de nuevo ... (JDK5) – zb226

Respuesta

35

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

Resulta que las posiciones de memoria en un sistema de 32 bits son referenciados por números 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.

Consulte this question para obtener más información sobre 32 vs 64 bit.

Edit: ¡Gracias mrjoltcola por el prefijo exa!

+0

viene después de peta;) Estoy algo implícito ya, pero creo que vale la pena señalar que, dado que el espacio de direcciones es tan grande, es más fácil encontrar un bloque contiguo más grande de espacio de direcciones disponible, por lo que puede especificar un tamaño de almacenamiento dinámico mucho mayor en un sistema operativo de 64 bits . – rob

+0

También vale la pena señalar que para la memoria, un Exabyte es 1024^6 bytes y un Exabyte de almacenamiento es 1000^6 bytes. Entonces 2^64 es 16 Exabytes de memoria y 18.4 Exabytes de almacenamiento. ;) –

6

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.

4

La memoria contigua no es el problema que limita el uso de solo 1,2 GB de Heap. Aunque se definió el montón mínimo/máximo, JVM ocuparía el máximo almacenamiento dinámico 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 pila 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.

Cuestiones relacionadas