studio programacion practicos móviles financiero ejemplos desarrollo curso contable asiento arrendamiento aplicaciones java memory-management reference integer-overflow

java - programacion - ¿Qué pasaría si tuviera que hacer más referencias a Objetos de las que pueden dar cuenta 32 bits?



curso android desarrollo de aplicaciones móviles pdf (2)

Entonces aprendí cuando declaras una variable de tipo Object (es decir, Object a; ), se asigna un espacio de 32 bits para esa variable. Dentro de esta variable / referencia, hay una dirección de memoria para un objeto real.

Ahora imaginemos que tengo una cantidad de memoria lo suficientemente grande para hacer esto.

¿Qué pasaría si creara más de 4,294,967,296 (2 32 ) variables del tipo Object e intenté asignarlas a un Object distinto? ¿Algunas variables / referencias obtendrían las mismas direcciones de memoria debido al desbordamiento de enteros? ¿Quiere decir que es imposible tener referencias a más de 4,294,967,296 objetos en la memoria?


Entonces aprendí cuando declaras una variable de tipo Object (es decir, Object a;), se asigna un espacio de 32 bits para esa variable. Dentro de esta variable / referencia, hay una dirección de memoria para un objeto real.

(Cuando hablas de "un espacio de 32 bits", la gente de TI inmediatamente pensará que te estás refiriendo a un espacio de direcciones ... ¡y un espacio de direcciones de 32 bits te da 2 ^ 32 bytes de almacenamiento!)

Entonces, suponiendo que realmente signifique "32 bits de espacio", lo que está diciendo podría ser correcto o podría ser incorrecto. Para una JVM de 32 bits, las referencias son de hecho de 32 bits de longitud, y eso significa que su programa puede (en teoría) referirse a un máximo de 2 ^ 32 objetos distintos, de cualquier tipo. Incluso representando 2 ^ 32 referencias distintas (32 bits) tomará 2 ^ 34 bytes.

Por otro lado, si está ejecutando su programa en una JVM de 64 bits, el tamaño de una referencia es de 64 bits, y eso significa que su programa puede (en teoría) referirse a hasta 2 ^ 64 objetos distintos.

Pero esto es todo teórico. El problema es que en una máquina de 32 bits, su programa no tendrá suficiente memoria para representar tantos objetos distintos. Un objeto mínimo de Java en una máquina de 32 bits ocupa (al menos) 8 bytes. Por lo tanto, incluso si tiene todo el espacio de direcciones disponible, solo podrá representar 2 ^ 29 objetos. Y en la práctica, el sistema operativo no proporciona a la JVM tanta memoria. De hecho, dependiendo del sistema operativo, puede obtener como máximo 2 a 3Gb de los posibles 4 GB de espacio de direcciones.

Por supuesto, si ejecuta una JVM de 64 bits (en un sistema operativo de 64 bits / y de 64 bits), tiene un espacio más grande para sus referencias de objetos Y puede tener más memoria para representarlos. Pero todavía vas a "golpear la pared" eventualmente ... debido a limitaciones de hardware.

Vale la pena señalar que Java también tiene una variedad de otros límites inherentes. Por ejemplo, las matrices pueden tener como máximo 2 ^ 31 elementos, las cadenas pueden tener como máximo 2 ^ 31 caracteres, los literales de cadena están limitados a 2 ^ 16 caracteres, y así sucesivamente. Estos límites son más fundamentales que el límite de referencia de 32 frente a 64 bits.

SEGUIR

Entonces, para abreviar las historias largas, siempre habrá un muro predeterminado, sin importar la cantidad de memoria que obligue a mi sistema operativo a dedicarme a mi programa en el momento de la compilación.

Eso es correcto. (Más o menos. No puede obligar al sistema operativo a dedicar memoria a su programa en el momento de la compilación . El tamaño de la memoria se determina cuando inicia el programa, no cuando lo compila). Básicamente, tiene los siguientes "controles" para mezclar ... en el momento del lanzamiento del programa:

  • La JVM (32 vs 64 bit) coloca un límite en la cantidad de memoria que es direccionable, y determina si las referencias son 32 o 64 bits. (Tenga en cuenta que esta es una opción de tiempo de ejecución. Los archivos de códigos de bytes compilados son idénticos para 32 y 64 bits).

  • Los -Xms y -Xmx dicen qué tan grande debe ser el montón ... sujeto a las limitaciones de direccionamiento y la cantidad de memoria que el sistema operativo está preparado para dar el proceso de JVM.

  • También hay una función OOPS comprimida que es relevante para una JVM de 64 bits, pero normalmente está activada de manera predeterminada.


Si bien el comentario de @ rcook es correcto con respecto a su ejemplo específico, @Nambari ha abordado los fundamentos de cómo se administra la memoria. Si no tiene suficientes ranuras en la memoria para asignar las referencias, la pila se desbordará. Al igual que no se puede agregar un elemento N+1 a una matriz de tamaño N , se aplica el mismo principio fundamental.