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

Ulr*_*olz 6 java boolean micro-optimization bitvector

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

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

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

mju*_*rez 5

JVM不会为您做到这一点.每个布尔值使用的内存中的实际大小通常是一个字节左右,但一般来说,它依赖于JVM.

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

请参阅Javadoc以供参考:

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


ass*_*ias 5

布尔值使用1个字节的内存(在热点上).你可以使用替代品:

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

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

  • @UlrichScholz 这取决于你有多少个布尔值——如果你的布尔值少于 64 个,那么 int 和 long 是迄今为止最好的选择——但如果你有数千个布尔值,BitSet 的开销将小得多布尔值使用的总内存。 (2认同)