Search code examples
javabooleanmicro-optimizationbitvector

java micro-optimization: combine set of boolean instance variables to bit vector based on int


We have a class with many instances and run into memory problems. Therefore, we try to reduce the memory requirements of this class. One idea would be the following.

The class has many boolean instance variables, each of which would take up one word in a naïve implementation. One could think of combining them to a mini bit vector stored in an int, such that their combined memory requirement would be one word.

But I would suspect that the Java VM is doing this optimization anyways, such that performing it by hand would not get any additional savings. Right?


Solution

  • A boolean uses 1 byte of memory (on hotspot). You could use alternatives:

    • a BitSet: uses approximately 1 bit per boolean + the overhead of the class itself, the reference to the BitSet, the reference to the long[] in the BitSet and the unused space in the long[], i.e. around 20 bytes
    • an int where each bit is a boolean to store 32 booleans in 4 bytes
    • a long where each bit is a boolean to store 64 booleans in 8 bytes

    The JVM is unlikely to do that optimisation for you (hotspot 8 doesn't).