¿Uso de memoria Java BigDecimal?
-
21-09-2019 - |
Pregunta
¿Existe una pauta para estimar la cantidad de memoria consumida por un BigDecimal
?
Buscando algo parecido a estos pautas para estimar String
uso de memoria.
Solución
Si nos fijamos en los campos de la fuente para BigDecimal
hay:
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 +?
el comentario para stringCache
dice
Se utiliza para almacenar la representación de cadena canónica, si se calcula.
Suponiendo que no llames .toString()
, permanecerá en cero bytes.Por eso BigDecimal
es (8+4+4)=16 bytes + BigInteger
.
BigInteger
en sí mismo es 4+4+4+4+4=20 bytes + mag
.
20+16 da un total de 36 bytes más la magnitud, que siempre es el número mínimo de bits necesarios para representar el número entero completo.por un numero n
será necesario log2(n)
bits, que se pueden convertir a enteros.Deberías utilizar aproximadamente:
36 + Ceiling(log2(n)/8.0) bytes
(tenga en cuenta que esto no incluye ninguna otra sobrecarga de descriptores de objetos como lo hace su enlace de ejemplo para cadenas, pero debería darle una buena idea general).
Otros consejos
Si se mira en las interioridades de BigDecimal
verá que utiliza una representación compacta si la mantisa es <= Long.MAX_VALUE
. Por lo tanto, el uso de la memoria puede variar dependiendo de los valores reales que están representando.