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