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