Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is Java's boolean primitive size not defined?

Tags:

java

boolean

The Java Virtual Machine Specification says that there is limited support for boolean primitive types.

There are no Java virtual machine instructions solely dedicated to operations on boolean values. Instead, expressions in the Java programming language that operate on boolean values are compiled to use values of the Java virtual machine int data type.

The above implies (although I may have misinterpreted it) that the int data type is used when operating on booleans, but this is a 32 bit memory construct. Given that a boolean only represents 1 bit of information:

  • Why is a byte, or short, type not used as the proxy for a boolean instead of int?
  • For any given JVM what's the most reliable way of finding out exactly how much memory is used to store a boolean type?
like image 686
Joel Avatar asked Dec 15 '09 13:12

Joel


People also ask

Why size of boolean is not defined in Java?

The Java Language Specification doesn't define sizes, only value ranges (see The Language Spec). So, it's not only the boolean size that's undefined at this level. And boolean has two possible values: false and true .

What is the default size of boolean Dataypes?

Boolean variables can either be True or False and are stored as 16-bit (2-byte) values.

What is a boolean primitive?

Another of the primitive data types is the type boolean . It is used to represent a single true/false value. A boolean value can have only one of two values: true false. In a Java program, the words true and false always mean these boolean values.


1 Answers

Short answer: yes, boolean values are manipulated as 32-bit entities, but arrays of booleans use 1 byte per element.

Longer answer: the JVM uses a 32-bit stack cell, used to hold local variables, method arguments, and expression values. Primitives that are smaller than 1 cell are padded out, primitives larger than 32 bits (long and double) take 2 cells. This technique minimizes the number of opcodes, but does have some peculiar side-effects (such as the need to mask bytes).

Primitives stored in arrays may use less than 32 bits, and there are different opcodes to load and store primitive values from an array. Boolean and byte values both use the baload and bastore opcodes, which implies that boolean arrays take 1 byte per element.

As far as in-memory object layout goes, this is covered under the "private implementation" rules, it can be 1 bit, 1 byte, or as another poster noted, aligned to a 64-bit double-word boundary. Most likely, it takes the basic word size of the underlying hardware (32 or 64 bits).


As far as minimizing the amount of space that booleans use: it really isn't an issue for most applications. Stack frames (holding local variables and method arguments) aren't very large, and in the big scheme a discrete boolean in an object isn't that large either. If you have lots of objects with lots of booleans, then you can use bit-fields that are managed via your getters and setters. However, you'll pay a penalty in CPU time that is probably bigger than the penalty in memory.

like image 171
kdgregory Avatar answered Sep 19 '22 10:09

kdgregory