Есть ли инструкция для оценки объема памяти, использованного a BigDecimal
?
Поиск чего-то подобного этим инструкциям для оценки String
использование памяти.
Если вы посмотрите на поля в источнике для BigDecimal
, то увидите:
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 +?
Комментарий для stringCache
говорит
Используется для хранения канонического строкового представления, если оно вычислено.
Если вы не вызываете .toString ()
, он останется нулевым байтом. Следовательно, BigDecimal
равно (8 + 4 + 4) = 16 байт + BigInteger
.
BigInteger
сам по себе равен 4 + 4 + 4 + 4 + 4 = 20 байтов + mag
.
20 + 16 дает всего 36 байтов плюс величина, которая всегда является минимальным количеством битов, необходимых для представления полного целого числа. Для числа n
потребуется log2 (n)
бит, которые можно преобразовать в целые числа. Вам следует использовать about:
36 + Ceiling(log2(n)/8.0) bytes
(обратите внимание, что это не включает в себя какие-либо другие служебные данные дескриптора объекта, как в вашем примере ссылки для строк, но это должно дать вам хорошее общее представление.)
Если вы углубитесь во внутреннее устройство BigDecimal
, вы увидите, что он использует компактное представление, если мантисса <= Long.MAX_VALUE
. Следовательно, использование памяти может варьироваться в зависимости от фактических значений, которые вы представляете.