Использование Java BigDecimal?

Есть ли ориентир для оценки объема памяти, потребляемого BigDecimal?

Ищите что-то похожее на эти рекомендации для оценки использования памяти String.

Ответы

Ответ 1

Если вы посмотрите на поля в источнике для 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

(обратите внимание, что это не включает какие-либо другие издержки дескриптора объекта, как это делает примерная ссылка на строки, но это должно дать вам хорошее общее представление.)

Ответ 2

Если вы выкопаете внутренние элементы BigDecimal, вы увидите, что он использует компактное представление, если значение имеет значение <= Long.MAX_VALUE. Следовательно, использование памяти может варьироваться в зависимости от фактических значений, которые вы представляете.