【问题标题】:java micro-optimization: combine set of boolean instance variables to bit vector based on intjava微优化:将一组布尔实例变量组合为基于int的位向量
【发布时间】:2015-06-02 08:14:44
【问题描述】:

我们有一个包含许多实例的类并且遇到了内存问题。因此,我们尽量减少这个类的内存需求。一个想法如下。

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

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

【问题讨论】:

  • 请更准确地了解大量实例 - 它们是一次都驻留在内存中,还是您只是制造(和丢弃)许多,我们在说多少大约,数千?米利翁??请更准确地了解 许多布尔实例变量 - 有多少?

标签: java boolean micro-optimization bitvector


【解决方案1】:

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

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

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

【讨论】:

  • 因此,使用 BitSet 节省内存至少需要 20x8=160 位。对于一个班级来说,这是很多位。好吧,然后我用手压实它们
  • @UlrichScholz 这取决于你有多少布尔值——如果你的布尔值少于 64 个,那么 int 和 long 是迄今为止最好的选择——但如果你有数千个布尔值,那么BitSet 在布尔值使用的总内存中所占的百分比要小得多。
【解决方案2】:

JVM 不会为您执行此操作。每个布尔值使用的实际内存大小通常约为一个字节,但通常它取决于 JVM。

如果您有这么多布尔变量,您应该考虑使用 BitSet,它旨在使用位来表示布尔值。

请参阅 Javadoc 以供参考:

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

【讨论】:

    猜你喜欢
    • 2021-11-03
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2011-12-25
    相关资源
    最近更新 更多