在Java中,为“ new Object()”在堆栈和堆上分配了多少内存

时间:2018-09-21 04:36:54

标签: java object memory allocation

这是我面试的问题之一,但我仍在努力解决。如果创建“ new Object()”,则该对象的引用将在堆栈上,在64位上为8字节。然后,问题是什么在堆上。采访者随后提到,将始终在堆上分配两件事,即“ Class”对象和“ Monitor”。有人可以解释创建“ new Object()”时分配多少内存/什么吗?

2 个答案:

答案 0 :(得分:6)

  

如果我创建“ new Object()”,则该对象的引用将在堆栈上,在64位上为8字节。

即使对于64位JVM,很有可能为4个字节。 Oracle / OpenJDK支持CompressesOops,它使用4个字节作为参考。

  

然后,问题是什么在堆上。

对象的标题。它没有字段。

  

采访者后来提到,总是在堆上分配两件事,即“ Class”对象

Class对象是堆外存储信息的代理。即使类的实例存在,它也不必存在(尽管对于Object来说已经存在)

  

以及“监视器”。

同样,仅在使用synchornized

时创建监视器
  

有人可以解释创建“ new Object()”时分配多少内存吗?

在64位JVM上,标头默认为12个字节,但是在对象对齐的情况下,它将使用16个字节。在32位JVM上,只有8个字节。

在具有CompressedOops的32位JVM和64位JVM上,引用仅为4个字节(这是大多数JVM)

答案 1 :(得分:5)

您的new Object()没有参考。它只是一个将在堆空间上分配的对象。

如果是这样的话:

Object someReference = new Object();

然后someReference将位于 thread stack 空间中。但是对象本身将始终在堆上。

举个例子:

如果要执行以下语句:

Employee emp = new Employee();

您将拥有类似的记忆力

  • :存储new Employee(),即实际对象
  • 堆栈:存储有关emp的信息,即引用
  • 烫发空间/元数据:存储有关Employee类的信息