Resposta curta: sim, os valores booleanos são manipulados como entidades de 32 bits, mas os arrays de booleanos usam 1 byte por elemento.
Resposta mais longa: a JVM usa uma pilha de células de 32 bits, usada para conter variáveis locais, argumentos de método e valores de expressão. Os primitivos menores que 1 célula são preenchidos, os primitivos maiores que 32 bits (longos e duplos) ocupam 2 células. Essa técnica minimiza o número de opcodes, mas tem alguns efeitos colaterais peculiares (como a necessidade de mascarar bytes).
Primitivos armazenados em matrizes podem usar menos de 32 bits, e existem opcodes diferentes para carregar e armazenar valores primitivos de uma matriz. Os valores booleanos e de byte usam opcodes baload
e bastore
, o que implica que os arrays booleanos usam 1 byte por elemento.
No que diz respeito ao layout de objeto na memória, isso é coberto pelas regras de "implementação privada" , pode ser de 1 bit, 1 byte ou, como outro usuário observou, alinhado a um limite de palavra dupla de 64 bits. Provavelmente, leva o tamanho de palavra básico do hardware subjacente (32 ou 64 bits).
No que diz respeito a minimizar a quantidade de espaço que os booleanos usam: realmente não é um problema para a maioria dos aplicativos. Os frames da pilha (contendo variáveis locais e argumentos de método) não são muito grandes e, no grande esquema, um booleano discreto em um objeto também não é tão grande. Se você tiver muitos objetos com muitos booleanos, poderá usar campos de bits que são gerenciados por meio de seus getters e setters. No entanto, você pagará uma penalidade no tempo de CPU que provavelmente é maior do que a penalidade na memória.