繁体   English   中英

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

[英]In Java, How much memory is allocated on stack and heap for “new Object()”

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

如果我创建“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)

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

如果是这样的话:

Object someReference = new Object();

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

让我们举一个例子:

如果您要执行此语句:

Employee emp = new Employee();

你有像以下的记忆:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM