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