关于内存管理:Java中的一个布尔值数组是否小于独立变量?

Is an array of one boolean in Java smaller than a standalone variable?

我对SO的搜索使我失败,因此,如果重复的话,请重定向我。

对于这个问题,我的问题是:我从经验和浏览SO中了解到,如果将Java boolean声明为独立值,则将Java boolean存储为32位int,但将其存储为8。 -bit byte(如果在数组中声明)。我的问题如下:哪个内存效率更高?数组的元数据是否会使它在内存中的容量大于备用内存?

1
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没有指定存储大小,实际上Oracle表示

This data type represents one bit of information, but its"size" isn't something that's precisely defined.

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


此Java专家文章是了解内存使用情况的良好来源。


正如user949300所提到的,所有对象的代价都是使它们大于基元。不过,对于仅一个布尔值而言,内存并不重要。如果要存储大量的布尔值,请考虑使用BitSet。我相信在幕后它每个布尔值大约使用1位(加上一些开销)。