java 微优化:将一组布尔实例变量组合成基于 int 的位向量
java micro-optimization: combine set of boolean instance variables to bit vector based on int
我们有一个 class 有很多实例和 运行 内存问题。因此,我们尝试减少此 class 的内存需求。一种想法如下。
class 有许多布尔实例变量,在天真的实现中,每个实例变量都会占用一个词。可以考虑将它们组合成一个存储在 int 中的迷你位向量,这样它们的组合内存需求将是一个字。
但我怀疑 Java VM 无论如何都在进行此优化,因此手动执行不会获得任何额外的节省。对吗?
JVM 不会为您做这些。每个布尔值实际使用的内存大小通常约为一个字节,但一般来说,它取决于 JVM。
如果您有那么多布尔变量,您应该考虑使用 BitSet,它旨在使用位来表示布尔值。
参考 Javadoc:
http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html
一个布尔值使用 1 个字节的内存(在热点上)。您可以使用替代方案:
- a BitSet:每个布尔值大约使用 1 位 + class 本身的开销,对 BitSet 的引用,对 BitSet 中
long[]
的引用以及未使用的 space 在 long[]
中,即大约 20 个字节
- 一个整数,其中每个位都是一个布尔值,用于在 4 个字节中存储 32 个布尔值
- 一个 long,其中每个位都是一个布尔值,用于在 8 个字节中存储 64 个布尔值
JVM 不太可能为您进行优化(热点 8 不会)。
我们有一个 class 有很多实例和 运行 内存问题。因此,我们尝试减少此 class 的内存需求。一种想法如下。
class 有许多布尔实例变量,在天真的实现中,每个实例变量都会占用一个词。可以考虑将它们组合成一个存储在 int 中的迷你位向量,这样它们的组合内存需求将是一个字。
但我怀疑 Java VM 无论如何都在进行此优化,因此手动执行不会获得任何额外的节省。对吗?
JVM 不会为您做这些。每个布尔值实际使用的内存大小通常约为一个字节,但一般来说,它取决于 JVM。
如果您有那么多布尔变量,您应该考虑使用 BitSet,它旨在使用位来表示布尔值。
参考 Javadoc:
http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html
一个布尔值使用 1 个字节的内存(在热点上)。您可以使用替代方案:
- a BitSet:每个布尔值大约使用 1 位 + class 本身的开销,对 BitSet 的引用,对 BitSet 中
long[]
的引用以及未使用的 space 在long[]
中,即大约 20 个字节 - 一个整数,其中每个位都是一个布尔值,用于在 4 个字节中存储 32 个布尔值
- 一个 long,其中每个位都是一个布尔值,用于在 8 个字节中存储 64 个布尔值
JVM 不太可能为您进行优化(热点 8 不会)。