Java BigDecimal использование памяти? - PullRequest
19 голосов
/ 23 марта 2010

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

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

Ответы [ 2 ]

19 голосов
/ 23 марта 2010

Если вы посмотрите на поля в источнике для 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: «Используется для хранения канонического строкового представления, если оно вычислено.» ) = 16 байт + BigInteger в BigDecimal и 4 + 4 + 4 + 4 + 4 = 20 байт + mag для BigInteger. Таким образом, в общей сложности 36 байтов плюс величина. Насколько я могу судить, величина - это всегда минимальное количество бит, необходимое для представления полного целого числа, поэтому для числа n потребуется log2 (n) бит, которые можно преобразовать в целые числа. В общем, вы должны использовать около:

36 + Ceiling(log2(n)/8.0) bytes

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

3 голосов
/ 23 марта 2010

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

...