Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 977
Ulrich Scholz Avatar asked Jun 02 '15 08:06

Ulrich Scholz


2 Answers

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).

like image 54
assylias Avatar answered Oct 31 '22 15:10

assylias


The JVM will not do that for you. The actual size in memory being used per boolean is usually around a byte, but in general, it's JVM dependent.

If you have that many boolean variables, you should think about using a BitSet, which is designed to use bits for representing boolean values.

See the Javadoc for reference:

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

like image 5
mjuarez Avatar answered Oct 31 '22 16:10

mjuarez