Espero que os registros Java 14 realmente usem menos memória que uma classe de dados semelhante.
Eles ou o uso de memória é o mesmo?
java
memory-footprint
java-14
java-record
Clancy Merrick
fonte
fonte
invokedynamic
para gerar preguiçosamente as implementações dos métodos Object (equals, hashCode) em vez de gerá-las estaticamente em tempo de compilação.Respostas:
Para adicionar à análise básica realizada pelo @lugiorgi e uma diferença perceptível semelhante que eu poderia analisar com o código de bytes, está na implementação de
toString
,equals
ehashcode
.Por um lado, a classe usada anteriormente com
Object
APIs de classe substituídas que parecemproduz o código de bytes da seguinte maneira
Por outro lado, a representação de registro para o mesmo
produz o bytecode tão menos quanto
Nota : Para o que eu pude observar nos acessadores e no código de bytes do construtor gerado, eles são parecidos para a representação e, portanto, excluídos dos dados aqui também.
fonte
Eu fiz alguns testes rápidos e sujos com as seguintes
vs.
O arquivo de registro compilado equivale a 1.475 bytes, a classe a 1.643 bytes. A diferença de tamanho provavelmente vem de diferentes implementações iguais / toString / hashCode.
Talvez alguém possa cavar um bytecode ...
fonte
correcta, I de acordo com [@lugiorgi] e [@Naman], a única diferença do código de bytes gerado entre uma ficha e a classe é equivalente na execução de métodos de:
toString
,equals
ehashCode
. Que no caso de uma classe de registro é implementada usando uma instrução de chamada dinâmica (indy) para o mesmo método de autoinicialização na classe:java.lang.runtime.ObjectMethods
(adicionado recentemente no projeto de registros). O fato de que esses três métodos,toString
,equals
ehashCode
, invocar a mesma inicialização método economiza mais espaço no arquivo de classe do que invocando 3 diferentes métodos Bootstraps. E, é claro, como já mostrado nas outras respostas, economiza mais espaço do que gerar o óbvio bytecodefonte