Java BigDecimal 内存使用情况?

发布于 2024-08-26 09:42:33 字数 183 浏览 9 评论 0原文

是否有用于估计 BigDecimal 消耗的内存量的指南?

寻找与这些指南类似的内容来估计String内存使用情况。

Is there a guideline for estimating the amount of memory consumed by a BigDecimal?

Looking for something similar to these guidelines for estimating String memory usage.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

初懵 2024-09-02 09:42:33

如果您查看 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

(请注意,这不包括任何其他对象描述符开销,就像您的字符串示例链接一样,但它应该为您提供一个很好的总体思路。)

If you look at the fields in the source for BigDecimal there is:

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 +?

The comment for stringCache says

Used to store the canonical string representation, if computed.

Assuming you don't call .toString(), it will remain zero bytes. Hence BigDecimal is (8+4+4)=16 bytes + BigInteger.

BigInteger itself is 4+4+4+4+4=20 bytes + mag.

20+16 gives total of 36 bytes plus the magnitude, which is always the minimum number of bits necessary to represent the full integer. For a number n it will need log2(n) bits, which can be converted to ints. You should be using about:

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

(note this doesn't include any of the other object descriptor overhead as your example link for strings does, but it should give you a good general idea.)

望笑 2024-09-02 09:42:33

如果您深入研究 BigDecimal 的内部结构,您会发现如果尾数为 <= Long.MAX_VALUE,它会使用紧凑的表示形式。因此,内存使用情况可能会根据您所表示的实际值而有所不同。

If you dig into the internals of BigDecimal you'll see that it uses a compact representation if the significand is <= Long.MAX_VALUE. Hence, the memory usage can vary depending on the actual values you're representing.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文