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

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

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

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

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

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


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