Espero que los registros de Java 14 realmente usen menos memoria que una clase de datos similar.
¿Son o el uso de memoria es el mismo?
java
memory-footprint
java-14
java-record
Clancy Merrick
fuente
fuente
invokedynamic
para generar perezosamente las implementaciones de métodos Object (equals, hashCode) en lugar de generarlas estáticamente en tiempo de compilación.Respuestas:
Para agregar al análisis básico realizado por @lugiorgi y una diferencia notable similar que podría llegar a analizar el código de bytes, está en la implementación de
toString
,equals
yhashcode
.Por un lado, clase utilizada anteriormente con
Object
API de clase anuladas que se parecen aproduce el código de bytes de la siguiente manera
Por otro lado la representación de registro para el mismo
produce el bytecode tan poco como
Nota : Por lo que pude observar en los accesos y el código de bytes de constructor generado, son iguales tanto para la representación como, por lo tanto, también están excluidos de los datos aquí.
fuente
Hice algunas pruebas rápidas y sucias con los siguientes
vs.
El archivo de registro compilado asciende a 1.475 bytes, la clase a 1.643 bytes. La diferencia de tamaño probablemente proviene de diferentes implementaciones equals / toString / hashCode.
Tal vez alguien pueda hacer una búsqueda de código de bytes ...
fuente
correcta, estoy de acuerdo con [@lugiorgi] y [@Naman], la única diferencia en el código de bytes que se genera entre un registro y la clase es equivalente en la aplicación de métodos:
toString
,equals
yhashCode
. Que en el caso de una clase de registro se implementan utilizando una instrucción dinámica de invocación (indy) para el mismo método de arranque en clase:java.lang.runtime.ObjectMethods
(recién agregado en el proyecto de registros). El hecho de que estos tres métodos,toString
,equals
yhashCode
, invocar el mismo arranque método ahorra más espacio en el archivo de clase 3 de invocar métodos bootstraps diferentes. Y, por supuesto, como ya se mostró en las otras respuestas, ahorra más espacio que generar el bytecode obviofuente