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?
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)
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)!
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.
Por causa da -XX:+UseCompressedOopsopçã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.
Respostas:
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.
fonte
Por causa da
-XX:+UseCompressedOops
opção JVM HotSpot , as referências a objetos são 8 bytes.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.
fonte