Qual é o tamanho de uma variável de referência em java. Pode ser calculado?

9

Como os ponteiros em C exigem 2 bytes de tamanho de memória, independentemente do tamanho do tipo de dados que estão apontando. Então, o mesmo se aplica às referências java também?

Kushagra Thapar
fonte
7
em arquitecturas modernos (64 bits) C requer 8 bytes para um ponteiro, java utiliza 4 ou 8, dependendo da implementação subjacente (mas pode ser qualquer coisa desde que a semântica são preservados)
roquete aberração
Com C, isso também depende inteiramente da implementação. Você pode compilar para 32 bits (x86 antigo simples) e obter ponteiros de 4 bytes ou pode usar instruções e registros de 64 bits, mas ponteiros de 4 bytes (x32 ABI)!
Você também pode achar esclarecedor o Java Object Layout .
Jon Purdy

Respostas:

7

A Java Language Specification não diz nada sobre o tamanho de uma referência na memória. A JLS nem sequer dizer que uma referência precisa existir em tempo de execução em tudo . O compilador é livre para usar 42 gigabytes como referência ou eliminá-lo completamente, tornando o tamanho 0 bytes. (De fato, a Java Language Specification nunca diz nada sobre uma estratégia ou representação de implementação específica, especifica apenas a sintaxe e a semântica das construções da linguagem Java, não suas pragmáticas.)

A maioria das implementações comuns de Java simplesmente implementa referências como ponteiros, tornando-as do mesmo tamanho que em C. Às vezes, essas referências são chamadas de OOPs (ponteiros de objetos comuns). Mas a Oracle Hotspot JVM, por exemplo, possui um recurso chamado CompressedOOPs, que pode tornar algumas referências menores que os ponteiros C em sistemas de 64 bits.

Jörg W Mittag
fonte
5

Por causa da -XX:+UseCompressedOops opção JVM HotSpot , as referências a objetos são 8 bytes.

Permite o uso de ponteiros compactados (referências a objetos representados como deslocamentos de 32 bits em vez de ponteiros de 64 bits) para desempenho otimizado de 64 bits com tamanhos de heap Java menores que 32 gb.

Podemos testar isso adicionando uma referência a uma classe vazia e medindo seu uso de memória. Isso mostra 24 bytes usados ​​no heap. Adicione mais uma primitiva "byte", meça novamente e você verá 32 bytes de uso de heap.

Sagar Vaghela
fonte
o que é "UseCompressedOops"?
gnat
é um comando da memória jvm, oop significa Ordinary Object Pointer, é permitido aumentar o tamanho da pilha.
precisa saber é o seguinte