java micro-optimization:将一组布尔实例变量与基于int的位向量相结合

时间:2015-06-02 08:14:44

标签: java boolean micro-optimization bitvector

我们有一个包含许多实例的类并遇到内存问题。因此,我们尝试降低此类的内存​​需求。一个想法是以下。

该类有许多布尔实例变量,每个变量在初始实现中占用一个单词。可以想到将它们组合到存储在int中的迷你位向量,这样它们的组合存储器要求就是一个单词。

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

2 个答案:

答案 0 :(得分:5)

JVM不会为你做那件事。每个布尔值使用的内存中的实际大小通常大约是一个字节,但一般来说,它依赖于JVM。

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

请参阅Javadoc以供参考:

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

答案 1 :(得分:5)

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

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

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