Java BigDecimal Memory Nutzung?
-
21-09-2019 - |
Frage
Gibt es eine Richtlinie für die Schätzung der von a konsumierten Speichermenge BigDecimal
?
Auf der Suche nach etwas Ähnlichem wie diesen Richtlinien zur Schätzung String
Speichernutzung.
Lösung
Wenn Sie sich die Felder in der Quelle für ansehen BigDecimal
Es gibt:
BigDecimal:
long intCompact +8 bytes
int precision +4 bytes
int scale +4 bytes
String stringCache +?
BigInteger intVal +?
BigInteger:
int bitCount +4 bytes
int bitLength +4 bytes
int firstNonzeroIntNum +4 bytes
int lowestSetBit +4 bytes
int signum +4 bytes
int[] mag +?
Der Kommentar für stringCache
sagt
Wird verwendet, um die kanonische String -Darstellung zu speichern, falls berechnet.
Angenommen, Sie rufen nicht an .toString()
, Es bleibt Null Bytes. Somit BigDecimal
IS (8+4+4) = 16 Bytes+ BigInteger
.
BigInteger
selbst ist 4+4+4+4+4 = 20 Bytes+ mag
.
20+16 ergibt insgesamt 36 Bytes zuzüglich der Größe, was immer die minimale Anzahl von Bits ist, die erforderlich sind, um die vollständige Ganzzahl darzustellen. Für eine Nummer n
es wird brauchen log2(n)
Bits, die in INTs umgewandelt werden können. Sie sollten ungefähr verwenden:
36 + Ceiling(log2(n)/8.0) bytes
(Beachten Sie, dass dies keiner der anderen Objektdeskriptor -Overheads wie Ihr Beispiel -Link für Zeichenfolgen enthält, aber es sollte Ihnen eine gute allgemeine Idee geben.)
Andere Tipps
Wenn Sie sich in die Interna befinden BigDecimal
Sie werden feststellen, dass es eine kompakte Darstellung verwendet, wenn der Signifikant <= <= ist Long.MAX_VALUE
. Daher kann die Speicherverwendung je nach den tatsächlichen Werten variieren, die Sie darstellen.