Is there a guideline for estimating the amount of memory consumed by a BigDecimal
?
Looking for something similar to these guidelines for estimating String
memory usage.
Assuming you don't call . toString() , it will remain zero bytes. Hence BigDecimal is (8+4+4)=16 bytes + BigInteger . BigInteger itself is 4+4+4+4+4=20 bytes + mag .
A BigDecimal consists of a random precision integer unscaled value and a 32-bit integer scale.
The largest value BigDecimal can represent requires 8 GB of memory.
According to my own benchmarking for my specific use case it's 10 - 20x slower than double (much better than 1000x) - basically for addition / multiplication.
If you look at the fields in the source for BigDecimal
there is:
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 +?
The comment for stringCache
says
Used to store the canonical string representation, if computed.
Assuming you don't call .toString()
, it will remain zero bytes. Hence BigDecimal
is (8+4+4)=16 bytes + BigInteger
.
BigInteger
itself is 4+4+4+4+4=20 bytes + mag
.
20+16 gives total of 36 bytes plus the magnitude, which is always the minimum number of bits necessary to represent the full integer. For a number n
it will need log2(n)
bits, which can be converted to ints. You should be using about:
36 + Ceiling(log2(n)/8.0) bytes
(note this doesn't include any of the other object descriptor overhead as your example link for strings does, but it should give you a good general idea.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With