作者:YI恐龙_554 | 来源:互联网 | 2022-12-04 11:45
这是我的面试问题之一,但我仍然试图解决这个问题.如果我创建"new Object()",则对该对象的引用将在堆栈上,这将是64位上的8个字节.然后,问题是什么在堆上.采访者后来提到,堆上总会分配两件事,分别是"Class"对象和"Monitor".有人可以解释一下在创建"new Object()"时会分配多少内存/分配的内容?
1> Peter Lawrey..:
如果我创建"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)
2> Shanu Gupta..:
你new Object()
没有参考.它只是一个将在堆空间上分配的对象.
如果是这样的话:
Object someReference = new Object();
然后someReference
将在线程的堆栈空间.但是对象本身将始终在堆上.
让我们举一个例子:
如果您要执行此语句:
Employee emp = new Employee();
你有像以下的记忆:
堆:存储new Employee()
即实际对象
堆栈:存储有关emp
ie参考的信息
Perm Space/Metaspace:存储有关Employee
类的信息