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

Wan*_*tic 2 java memory allocation object

这是我的面试问题之一,但我仍然试图解决这个问题.如果我创建"new Object()",则对该对象的引用将在堆栈上,这将是64位上的8个字节.然后,问题是什么在堆上.采访者后来提到,堆上总会分配两件事,分别是"Class"对象和"Monitor".有人可以解释一下在创建"new Object()"时会分配多少内存/分配的内容?

Pet*_*rey 6

如果我创建"new Object()",则对该对象的引用将在堆栈上,这将是64位上的8个字节.

即使对于64位JVM,最有可能是4字节.Oracle/OpenJDK支持使用4个字节进行引用的CompressesOops.

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

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

采访者后来提到,总会在堆上分配两个东西,即"类"对象

Class目的是一种用于信息存储的堆外的代理.即使存在类的实例,它也不一定存在(尽管对于Object它可能已经存在)

以及"监视器".

同样,只有在使用时才会创建监视器 synchornized

有人可以解释一下在创建"new Object()"时会分配多少内存/分配的内容?

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

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


Sha*_*pta 5

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

如果是这样的话:

Object someReference = new Object();
Run Code Online (Sandbox Code Playgroud)

然后someReference将在线程堆栈空间.但是对象本身将始终在堆上.

让我们举一个例子:

如果您要执行此语句:

Employee emp = new Employee();
Run Code Online (Sandbox Code Playgroud)

你有像以下的记忆:

  • :存储new Employee()即实际对象
  • 堆栈:存储有关empie参考的信息
  • Perm Space/Metaspace:存储有关Employee类的信息