Gibt es eine Richtlinie zum Abschätzen der Speichermenge, die von einem BigDecimal
verbraucht wird?Java BigDecimal Speicherverbrauch?
Auf der Suche nach etwas ähnlich wie diese guidelines für die Schätzung String
Speicherverbrauch.
Gibt es eine Richtlinie zum Abschätzen der Speichermenge, die von einem BigDecimal
verbraucht wird?Java BigDecimal Speicherverbrauch?
Auf der Suche nach etwas ähnlich wie diese guidelines für die Schätzung String
Speicherverbrauch.
Wenn man sich die Felder in der Quelle für BigDecimal sehen gibt es:
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 wird „verwendet, um die kanonische Zeichenfolgendarstellung zu speichern, wenn berechnet wird.“, So der Annahme, dass Sie don‘ t toString aufrufen wir werden das als null Bytes belassen, also insgesamt gibt es (8 + 4 + 4) = 16 Bytes + BigInteger in BigDecimal und 4 + 4 + 4 + 4 + 4 = 20 Bytes + mag für BigInteger. Also insgesamt 36 Bytes plus die Magnitude. Soweit ich sagen kann, ist die Größe immer die minimale Anzahl von Bits, die notwendig ist, um die ganze Zahl darzustellen, so dass für eine Zahl n Log2 (n) Bits benötigt werden, die in Ints umgewandelt werden können. So im Allgemeinen sollten Sie werden mit etwa:
36 + Ceiling(log2(n)/8.0) bytes
(beachten Sie, dies beinhaltet nicht eine der anderen Objektdeskriptorabschnitt Overhead als Beispiel Link für Strings nicht, aber es sollte Ihnen einen guten Überblick geben.)
Beachten Sie, dass 'stringCache' und 'intVal' Referenzzeiger haben (jvm impl abhängig 4 oder 8 Bytes). Erinnern Sie sich auch an den Min 12 Byte-Header-Overhead ('BigInteger' und 'BigDecimal', int []) und schließlich an 8 Byte, um alle Objektgrößen auszurichten (zu runden). –
s/Cieling/Decke / – thisfred
Wenn Sie in die Interna von BigDecimal
graben, werden Sie sehen, dass es eine kompakte Darstellung verwendet, wenn der Signifikand < = Long.MAX_VALUE
ist. Daher kann die Speichernutzung abhängig von den tatsächlichen Werten variieren, die Sie repräsentieren.
Was ist die kompakte Darstellung? –
Ähnliches mit einer größeren Konstante. Natürlich, wie 'String', ist es abhängig von der Implementierung. –
Haben Sie diesen gelesen: http://www.javaworld.com/javaworld/javatips/jw-javatip130.html – PeterMmm