Memory JVM 64位不同的内存使用?

Memory JVM 64位不同的内存使用?,memory,jvm,heap,Memory,Jvm,Heap,我读过一些书,但有一件事我并不完全确定,例如,在JVM 64位中,这将使用多少内存(如果这是一个愚蠢的问题,请原谅,但我有点困惑,对此不太了解): MyObject[]myArray;-我知道一个数组需要24个字节,但是这个数组中的每个元素需要多少字节?每个元素都是对象引用吗,即每个元素8字节?如果不是,我如何知道该数组中每个元素需要多少字节?通常,也就是说,当使用小于32 GB的堆大小时,64位JVM使用它将对象指针存储为32位整数(使用时按3位缩放,因为所有对象都对齐到8字节;有关详细信息,

我读过一些书,但有一件事我并不完全确定,例如,在JVM 64位中,这将使用多少内存(如果这是一个愚蠢的问题,请原谅,但我有点困惑,对此不太了解):


MyObject[]myArray;-我知道一个数组需要24个字节,但是这个数组中的每个元素需要多少字节?每个元素都是对象引用吗,即每个元素8字节?如果不是,我如何知道该数组中每个元素需要多少字节?

通常,也就是说,当使用小于32 GB的堆大小时,64位JVM使用它将对象指针存储为32位整数(使用时按3位缩放,因为所有对象都对齐到8字节;有关详细信息,请参阅链接),所以每个元素实际上只使用4个字节

但是,如果使用超过32GB的堆或关闭压缩OOP,那么每个元素实际上将使用8个字节

另外,我怀疑您关于数组头的24字节的声明是错误的。首先,在压缩oops时,头中的类引用也会被压缩,标识哈希代码和数组长度字段的开头是32位,因此我怀疑它更可能使用12个字节。即使使用全长oops,也应该只需要16个字节。然而,我也找不到任何可靠的来源。然而,一般来说,应该说Hotspot甚至不使用固定大小的对象头,而是根据对象的不同情况使用大小不同的头。描述了其中一些情况

至少在热点JVM上是这样。由于JLS没有指定任何原语大小,理论上,它可以是任何给定JVM上的任何东西,当然,8字节是最可能的实现选择。

是关于如何计算Java数组内存使用率的好信息

比如说


让我们考虑一个10x10int数组。首先,“外部”数组有12字节的对象头,后面是10个元素的空间。这些元素是对组成行的10个数组的对象引用。即12+4*10=52字节,然后必须将其四舍五入到8的下一个倍数,即56。然后,10行中的每一行都有自己的12字节对象头,4*10=40字节表示实际的整数行,同样,4字节的填充使该行的总数达到8的倍数。总的来说,这就是11*56=616字节。这比你只计算100个“原始”整数的10*10*4=400字节要大一点

感谢您的快速回复!如果可以(7分钟),将标记为应答。当您使用小于的堆时,默认情况下会启用压缩oops32GB@Joni:你知道的越多。我认为它仍然只是额外空间敏感程序的可选功能。我编辑了答案以反映这一点。谢谢。那篇文章和你的答案描述了一个32位虚拟机。