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