O que aconteceria se eu fizesse mais referências a Objetos do que 32 bits podem ser responsáveis?

Então eu aprendi quando você declara uma variável do tipo Object (isto é, Object a; ), um espaço de 32 bits é alocado para aquela variável. Dentro dessa variável / referência, há um endereço de memory para um object real.

Agora vamos fingir que tenho uma quantidade suficiente de memory para fazer isso.

O que aconteceria se eu criasse mais de 4.294.967.296 (2 32 ) variables ​​do tipo Object e tentasse atribuí-las a um Objeto distinto? Algumas variables ​​/ referências obteriam os mesmos endereços de memory devido ao estouro de inteiro? Ou seja, é impossível ter referências a mais de 4.294.967.296 objects na memory?

Então eu aprendi quando você declara uma variável do tipo Object (isto é, Object a;), um espaço de 32 bits é alocado para aquela variável. Dentro dessa variável / referência, há um endereço de memory para um object real.

(Quando você fala sobre “um espaço de 32 bits”, o pessoal de TI imediatamente pensa que você está se referindo a um espaço de endereço … e um espaço de endereço de 32 bits fornece 2 ^ 32 bytes de armazenamento!)

Então, supondo que você realmente quer dizer “32 bits de espaço”, o que você está dizendo pode estar certo, ou pode estar errado. Para uma JVM de 32 bits, as referências são de fato de 32 bits, e isso significa que seu programa pode (em teoria) referir-se a no máximo 2 ^ 32 objects distintos, de qualquer tipo. Mesmo representando 2 ^ 32 referências distintas (32 bits) terá 2 ^ 34 bytes.

Por outro lado, se você estiver executando seu programa em uma JVM de 64 bits, o tamanho de uma referência é de 64 bits, e isso significa que seu programa pode (em teoria) se referir a 2 ^ 64 objects distintos.

Mas isso é tudo teórico. O problema é que, em uma máquina de 32 bits, seu programa não terá memory suficiente para representar muitos objects distintos. Um object Java mínimo em uma máquina de 32 bits ocupa (no mínimo) 8 bytes. Portanto, mesmo que você tenha todo o espaço de endereçamento disponível, você só poderá representar 2 ^ 29 objects. E, na prática, o sistema operacional não fornece muita memory à JVM. De fato, dependendo do sistema operacional, ele pode obter no máximo 2 a 3 Gb do possível 4 Gb de espaço de endereço.


É claro que, se você executar uma JVM de 64 bits (em um sistema operacional de 64 bits e 64 bits), terá um espaço maior para as referências de objects E poderá ter mais memory para representá-los. Mas você ainda vai “bater na parede” eventualmente … devido a limitações de hardware.

Vale a pena notar que o Java tem uma variedade de outros limites inerentes também. Por exemplo, os arrays podem ter no máximo 2 ^ 31 elementos, Strings podem ter no máximo 2 ^ 31 caracteres, literais de string são limitados a 2 ^ 16 caracteres e assim por diante. Estes limites são mais fundamentais do que o limite de referência de 32 vs 64 bits.


ACOMPANHAMENTO

Então, para encurtar as histórias, sempre haverá uma parede pré-determinada, não importa quanta memory eu force meu sistema operacional a dedicar ao meu programa em tempo de compilation?

Está correto. (Mais ou menos. Você não pode forçar o SO a dedicar memory ao seu programa em tempo de compilation . O tamanho da memory é determinado quando você inicia o programa, não quando você o compila.) Basicamente, você tem os seguintes “botões” para girar. … no horário de lançamento do programa:

  • A JVM (32 vs 64 bits) coloca um limite na quantidade de memory endereçável e determina se as referências são 32 ou 64 bits. (Observe que essa é uma opção de tempo de execução. Os arquivos de bytecode compilados são idênticos para 32 e 64 bits).

  • O -Xms e -Xmx indicam o tamanho do heap … sujeito às restrições de endereçamento e à quantidade de memory que o sistema operacional está preparado para fornecer o processo da JVM.

  • Há também um recurso OOPS Compactado que é relevante para uma JVM de 64 bits, mas geralmente é ativado por padrão.

Enquanto o comentário do @cook está correto com relação ao seu exemplo específico, o @Nambari tocou nos fundamentos de como a memory é gerenciada. Se você não tiver slots suficientes na memory para alocar as referências, a pilha irá estourar. Assim como você não pode adicionar um N+1 elemento a uma matriz de tamanho N , o mesmo princípio fundamental se aplica.