Java中一个布尔值的数组是否比独立变量小?

Java中一个布尔值的数组是否比独立变量小?,java,memory-management,boolean,Java,Memory Management,Boolean,我在SO上的搜索失败,因此如果这是重复的,请重定向我 有了这些,我的问题是:我从经验和浏览中了解到,如果将Java布尔值声明为独立值,它将存储为32位int,但如果在数组中声明,它将存储为8位字节。我的问题如下:哪个内存效率更高?阵列的元数据是否使其在内存中比其他阵列更大? boolean oneVariable = false, oneArray[] = {false}; 数组是一个实际的对象,带有内存损耗(我相信是12字节),因此基本布尔值更小。数组的“元数据”包括: 对象头为8字节(3

我在SO上的搜索失败,因此如果这是重复的,请重定向我

有了这些,我的问题是:我从经验和浏览中了解到,如果将Java
布尔值声明为独立值,它将存储为32位
int
,但如果在数组中声明,它将存储为8位
字节。我的问题如下:哪个内存效率更高?阵列的元数据是否使其在内存中比其他阵列更大?

boolean oneVariable = false, oneArray[] = {false};

数组是一个实际的对象,带有内存损耗(我相信是12字节),因此基本布尔值更小。

数组的“元数据”包括:

  • 对象头为8字节(32位JVM)或16字节(64位JVM)
  • 数组长度为4字节(32位)
为布尔数据添加1个必要的字节,您至少有13个字节(32位)或21个字节(64位)

但是,对象是以8字节的倍数分配内存的,因此,尽管布尔值只需要12或20字节的开销+1字节,但数组对象最终将分别使用16或24字节的内存

除了对象本身将占用的16/24字节外,对象的内存地址还需要4个字节(32位)或8个字节(64位),分别总计20或32个字节的内存,才能将布尔值存储在数组中

独立变量的大小取决于JVM。Java没有指定存储的大小,事实上

此数据类型表示一位信息,但其“大小”并不是精确定义的


较旧的JVM使用32位堆栈单元,用于保存局部变量、方法参数和表达式值,因此用作变量的单个布尔值将消耗4个字节;使数组的成本至少是单个布尔值的5倍。例如,如果布尔值是一个类变量,那么这个答案可能会有所不同,在这种情况下,它只是添加到现有开销中的一个字节。在较新的JVM中,单个布尔值仅使用1字节,但根据其上下文和对齐内存地址所需的8字节填充,仍可能消耗多达8字节的堆空间。它仍然比布尔数组小。

如前所述,所有对象都会受到惩罚,使它们比基本体大。不过,对于一个布尔值,内存实际上并不重要。如果要存储大量布尔值,请考虑使用A。我相信在幕后,它大约每布尔使用1位(加上一些开销)。

Java专家文章是了解内存使用情况的一个很好的来源。

这不是比较苹果和梨吗?第一个具有值语义,第二个具有引用语义。选择你需要的一个。它比较了内存管理技术,比如橘子和克莱门汀。对于这个思维实验,它是一个单一的
布尔值
。额外的4个字节是长度。我们真的不应该在这里重复错误:布尔值只使用一个字节(为什么它应该使用4个字节?)在HotSpot中,它的效率要低16倍。@voo与其说是一个错误,不如说是一个依赖于JVM的值。你把答案扩展并改正,而不是告诉我我在撒谎,怎么样?所有对象都有4个字节用于等待/通知,4个字节用于其他内容(不确定是什么)。数组的长度也有4个字节。那么12。正如Daniel所指出的,该大小被四舍五入为8的倍数。所以我提到的“12字节”实际上是16,它引用了类数据结构,这是32位还是64位,取决于JVM。(您必须知道对象的类型)数组的“字段”长度为4位。还有4个字节用于其他东西,包括对象监视器。所有对象都是在8字节的边界上创建的。i、 他们总是保留8字节的倍数。如果这听起来很有效率,那么它的价值就不等于64位C&C++有16字节对齐。Peter Lawrey我想知道是否有些空间是用来放班级信息的。谢谢你的澄清!