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?
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?
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.
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.