Java中boolean无固定内存大小:局部变量按int处理占4字节(或寄存器优化不占内存),对象字段通常1字节且可紧凑打包,boolean[]数组元素明确占1字节(底层为byte[])。

Java 里的 boolean 类型没有固定字节数——它在不同场景下占用空间完全不同,不是“1 字节”或“1 位”能概括的。真正影响内存的是它出现的位置:是局部变量、对象字段,还是数组元素?JVM 不按语言语义分配空间,而是按运行时布局和硬件约束来安排。
作为局部变量或方法内值:按 int 处理,不必然占内存
编译后,true 变成 iconst_1,false 变成 iconst_0,后续所有操作都用 iload、istore、ifeq 等整型指令。这意味着:
- JVM 把它当作 32 位整数,在操作数栈和局部变量表中逻辑上占 4 字节
- 但 JIT 编译器可能全程把它留在 CPU 寄存器里,根本不写入内存
- 用
javap -c查看字节码,找不到任何bload或bstore指令——JVM 根本没有布尔专属指令
作为对象字段:通常 1 字节对齐,但常被“塞进空隙”
HotSpot 默认开启字段重排(-XX:+CompactFields),多个小字段会被打包到同一字节或相邻填充区:
- 单独一个
boolean a;字段,实际分配 1 字节,但可能和前面的byte b;共享同一字节 - 8 个连续
boolean字段大概率只占 1 字节(不是 8 字节),但你无法通过Unsafe直接读某一位——底层仍是字节级访问 - 关闭重排(
-XX:-CompactFields)反而会让对象变大,因为字段严格按源码顺序排列,填充更多 - 用 JOL(Java Object Layout)工具实测才能看到真实布局,比如
class A { boolean x; long y; }中,x后很可能补 7 字节填充,只为对齐y
作为 boolean[] 数组:每个元素占 1 字节,底层是 byte[]
这是唯一有明确实现约定的场景:JVM 必须让 boolean[i] 支持索引访问,但不要指望它压缩成位图:
立即学习“Java免费学习笔记(深入)”;
-
new boolean[1000]实际分配一个 1000 字节的byte[],每个索引对应一个字节(0 表示false,非零如 1 表示true) - 加上对象头(12 字节)、长度字段(4 字节)、可能的对齐填充(如补到 16 字节倍数),总大小远超 1000 字节
- JNI 层传
boolean[]时,自动转为jboolean*(即unsigned char*),仍是字节指针,不是位指针 - 真要省空间,请用
BitSet(内部用long[]+ 位运算)或手写位操作,别依赖boolean[]
Boolean 包装类:开销巨大,和原始类型完全不是一回事
Boolean 是对象,它的内存成本来自三部分:
- 对象头:至少 12 字节(Mark Word + Klass Pointer)
- 实例字段:HotSpot 中已改为
byte value,占 1 字节 - 引用本身:栈上局部变量是 4 或 8 字节指针;堆上对象还要算 GC 元数据
也就是说,一个 Boolean.TRUE 至少占 16 字节以上(含对齐),比原始 boolean 大一个数量级。自动装箱(如 list.add(flag))会触发新对象创建,高频路径务必避免。


















