Java微优化:将一组布尔实例变量组合成基于int的位向量

6
我们有一个具有许多实例的类,并遇到了内存问题。因此,我们尝试减少此类的内存需求。一个想法是将许多布尔实例变量组合成一个int类型的小位向量,这样它们的组合内存需求将为一个字。但我怀疑Java虚拟机已经自动进行了此优化,因此手动执行此操作不会获得任何额外的节省。对吗?

请更加精确地说明“大量实例” - 它们是否同时驻留在内存中,还是您只是创建(并丢弃)许多实例,而且数量有多少,是数千个吗?还是百万级别的?请更加精确地说明“许多布尔实例变量” - 有多少个? - OldCurmudgeon
2个回答

5
JVM不会代替你实现这个功能。每个布尔类型在内存中实际使用的大小通常约为一个字节,但总体而言,这取决于JVM。
如果你有那么多布尔变量,应该考虑使用BitSet,它是专门用于表示布尔值的位集合。
请参阅Javadoc进行参考: http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html

5
一个布尔值在Hotspot上使用1字节的内存。你可以使用以下替代方案:
  • BitSet:每个布尔值使用约1位+类本身的开销,对BitSet的引用,对BitSet中的long[]的引用以及long[]中未使用的空间,即约20字节。
  • 使用一个int,其中每个位是一个布尔值,可以用4字节存储32个布尔值。
  • 使用一个long,其中每个位是一个布尔值,可以用8字节存储64个布尔值。
JVM不太可能为您进行此优化(hotspot 8不会)。

因此,为了通过使用BitSet节省内存,至少需要20x8 = 160个位。这对于单个类来说是很多的位。好吧,那么我会手动压缩它们。 - Ulrich Scholz
2
@UlrichScholz 这取决于您有多少布尔值 - 如果您少于64个,则int和long是迄今为止最好的选择 - 但如果您有数千个布尔值,则BitSet的开销将是布尔值使用的总内存的一个更小的百分比。 - assylias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接