Java虚拟机规范指出,对布尔基本类型的支持有限
没有专门用于布尔值操作的Java虚拟机指令。相反,Java编程语言中对布尔值进行操作的表达式被编译为使用Java虚拟机int数据类型的值
上面暗示(尽管我可能误解了)在布尔运算时使用int数据类型,但这是一个32位内存结构。假设布尔值仅表示1位信息:
- 为什么一个字节或短类型不被用作布尔值而不是int的代理
- 对于任何给定的JVM,最可靠的方法是什么来确定存储布尔类型所使用的内存量
简短回答:是的,布尔值作为32位实体进行操作,但布尔数组每个元素使用1字节
更详细的回答:JVM使用32位堆栈单元,用于保存局部变量、方法参数和表达式值。小于1个单元的基元将被填充,大于32位(长且双)的基元将占用2个单元。这种技术使操作码的数量最小化,但确实有一些特殊的副作用(例如需要屏蔽字节)
存储在数组中的原语可能使用少于32位,并且有不同的操作码从数组中加载和存储原语值。布尔值和字节值都使用baload和bastore操作码,这意味着布尔数组每个元素占用1字节
至于内存中的对象布局,这在“私有实现”规则中有所涉及,它可以是1位、1字节,或者如另一张海报所述,与64位双字边界对齐。最有可能的是,它采用底层硬件的基本字大小(32或64位)
至于最小化布尔使用的空间量:对于大多数应用程序来说,这并不是一个问题。堆栈帧(包含局部变量和方法参数)不是很大,在大方案中,对象中的离散布尔值也没有那么大。如果有很多对象都有很多布尔值,那么可以使用通过getter和setter管理的位字段。但是,您将在CPU时间上支付的罚金可能比内存中的罚金更大