Java BigDecimal内存使用情况?

28

是否有一个指南来估算BigDecimal占用的内存量?希望找到类似于这些指南,用于估算String的内存使用情况。


与更大的常量类似。当然,就像“String”一样,它取决于实现。 - Tom Hawtin - tackline
1
你读过这个吗:http://www.javaworld.com/javaworld/javatips/jw-javatip130.html - PeterMmm
2个回答

26

如果您查看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)位,可以转换为int。 您应该使用大约:

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

(请注意,这不包括您在字符串示例链接中看到的任何其他对象描述符开销,但它应该为您提供一个良好的一般性概念。)


2
请注意,'stringCache'和'intVal'将具有引用指针(jvm实现相关的4或8个字节)。还要记住最小12字节的对象头开销('BigInteger'和'BigDecimal',int []),最后8字节对齐(向上舍入)所有对象大小。 - Joseph Lust

2

如果你深入了解BigDecimal的内部结构,你会发现如果尾数小于或等于Long.MAX_VALUE,则其使用紧凑的表示方式。因此,实际所表示的值不同,内存使用量也会有所变化。


什么是紧凑表示法? - Marcus Leon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接