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

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

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


person Marcus Leon    schedule 23.03.2010    source источник
comment
То же самое с большей константой. Конечно, как и String, это зависит от реализации.   -  person Tom Hawtin - tackline    schedule 23.03.2010
comment
Вы читали это: javaworld.com/javaworld/javatips/jw-javatip130. html   -  person PeterMmm    schedule 23.03.2010


Ответы (2)


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

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

person M. Jessup    schedule 23.03.2010
comment
Имейте в виду, что 'stringCache' и 'intVal' будут иметь ссылочные указатели (jvm impl зависит от 4 или 8 байтов). Также помните минимальные 12-байтовые накладные расходы заголовка объекта («BigInteger» и «BigDecimal», int[]) и, наконец, 8-байтовое выравнивание (округление) всех размеров объекта. - person Joseph Lust; 25.01.2014

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

person Adamski    schedule 23.03.2010
comment
Что такое компактное представление? - person Marcus Leon; 23.03.2010
comment
Это неправильно. Компактное представление — это оптимизация /времени/, а не оптимизации /пространства/. Другие поля все еще присутствуют, когда используется компактное представление. Таким образом, это фактически увеличивает пространство накладных расходов. - person rrrrrrrrrrrrrrrr; 02.12.2020