java微优化:将布尔实例变量集结合到基于int的位向量

java微优化:将布尔实例变量集结合到基于int的位向量,java,boolean,micro-optimization,bitvector,Java,Boolean,Micro Optimization,Bitvector,我们有一个有很多实例的类,并且遇到了内存问题。因此,我们试图减少此类的内存需求。一个想法是如下 该类有许多布尔实例变量,在一个简单的实现中,每个变量将占用一个单词。可以考虑将它们组合成一个存储在int中的迷你位向量,这样它们的组合内存需求将是一个字 但我怀疑Java VM正在以任何方式进行这种优化,因此手动执行不会获得任何额外的节省。对吗?JVM不会为您这样做。每个布尔值使用的内存中的实际大小通常在一个字节左右,但一般来说,它依赖于JVM 如果有那么多布尔变量,应该考虑使用位集,该位集旨在使用位

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

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


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

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

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

请参阅Javadoc以获取参考:


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

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

JVM不太可能为您进行这种优化(hotspot 8不会)。

请更精确地描述大量实例—它们是同时驻留在内存中,还是您只是制造(并丢弃)了很多,我们所说的有多少,数千?米利昂??请更精确地描述许多布尔实例变量-多少?因此,使用位集节省内存至少需要20x8=160位。对于单个类来说,这是很多位。好吧,那我就把它们压缩起来hand@UlrichScholz这取决于你有多少个布尔值——如果少于64个,那么int和long是目前为止最好的选择——但是如果你有数千个布尔值,那么一个位集的开销在布尔值使用的总内存中所占的百分比会小得多。