Ich hoffe, dass Java 14-Datensätze tatsächlich weniger Speicher belegen als eine ähnliche Datenklasse.
Sind sie oder ist die Speichernutzung gleich?
java
memory-footprint
java-14
java-record
Clancy Merrick
quelle
quelle
invokedynamic
, um die Implementierungen von Object-Methoden (equals, hashCode) träge zu generieren, anstatt sie zur Kompilierungszeit statisch zu generieren.Antworten:
Zu der von @lugiorgi durchgeführten Basisanalyse und einem ähnlichen bemerkenswerten Unterschied, den ich bei der Analyse des Bytecodes finden könnte, gehört die Implementierung von
toString
,equals
undhashcode
.Einerseits zuvor verwendete Klasse mit überschriebenen
Object
Klassen-APIs, die aussehenerzeugt den Bytecode wie folgt
Zum anderen die Datensatzdarstellung dafür
erzeugt den Bytecode so klein wie
Hinweis : Soweit ich die generierten Accessoren und Konstruktorbyte-Codes beobachten konnte, sind sie sowohl für die Darstellung gleich als auch daher auch hier von den Daten ausgeschlossen.
quelle
Ich habe einige schnelle und schmutzige Tests mit folgenden durchgeführt
vs.
Die kompilierte Datensatzdatei beträgt 1,475 Byte, die Klasse 1,643 Byte. Der Größenunterschied beruht wahrscheinlich auf verschiedenen Implementierungen von equals / toString / hashCode.
Vielleicht kann jemand Bytecode graben ...
quelle
richtig, ich bin einverstanden mit [@lugiorgi] und [@Naman], der einzigen Unterschied in der erzeugten Bytecode zwischen einem Datensatz und der äquivalenten Klasse ist bei der Umsetzung von Methoden:
toString
,equals
undhashCode
. Welche im Fall einer Datensatzklasse mithilfe einer dynamischen (Indy-) Aufrufanweisung für dieselbe Bootstrap-Methode in der Klasse implementiert werden:java.lang.runtime.ObjectMethods
(frisch im Datensatzprojekt hinzugefügt). Die Tatsache , dass diese drei MethodentoString
,equals
undhashCode
rufen Sie den gleichen Bootstrap - Methode mehr Platz in der Klassendatei speichert als Methoden 3 verschiedene Schopf aus dem Sumpf aufgerufen wird . Und natürlich spart, wie bereits in den anderen Antworten gezeigt, mehr Platz als das Generieren des offensichtlichen Bytecodesquelle