6

我们有一个有很多实例的类并且遇到了内存问题。因此,我们尽量减少这个类的内存需求。一个想法如下。

该类有许多布尔实例变量,在幼稚的实现中,每个变量都会占用一个单词。可以考虑将它们组合成一个存储在 int 中的迷你位向量,这样它们的组合内存需求将是一个单词。

但我怀疑 Java VM 无论如何都在进行这种优化,因此手动执行它不会获得任何额外的节省。正确的?

4

2 回答 2

5

JVM 不会为您执行此操作。每个布尔值使用的实际内存大小通常约为一个字节,但通常它取决于 JVM。

如果你有那么多布尔变量,你应该考虑使用 BitSet,它旨在使用位来表示布尔值。

请参阅 Javadoc 以供参考:

http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html

于 2015-06-02T08:21:59.613 回答
5

布尔值使用 1 个字节的内存(在热点上)。您可以使用替代方案:

  • 一个 BitSet:每个布尔值使用大约 1 位 + 类本身的开销、对 BitSet 的引用、对 BitSet 中的引用long[]和 中的未使用空间long[],即大约 20 个字节
  • 一个 int,其中每个位都是一个布尔值,用于在 4 个字节中存储 32 个布尔值
  • 一个长的,其中每个位都是一个布尔值,用于在 8 个字节中存储 64 个布尔值

JVM 不太可能为您进行优化(热点 8 没有)。

于 2015-06-02T08:22:15.847 回答