java对象的内存预留

时间:2015-04-14 17:21:03

标签: java c++ memory

我知道在c ++中声明对象实例时如此:

Object object

调用Object构造函数并为该对象提供内存,但是我发现当你在java中执行此操作时,对象实例在以下情况下没有值:

object = new Object()

写的。我想特别知道为对象提供内存的时间。我认为构造和新关键字都分配了内存,所以Object object = new Object()似乎是多余的。我在oracle的网站上看到了声明" reserve"记忆和新的"分配"记忆,我想知道两者之间有什么区别。

5 个答案:

答案 0 :(得分:5)

您需要区分变量所需的空间和对象所需的空间。请记住,变量的值只是一个引用 - 非常类似于C ++中的指针。所以如果你有:

Object x = null;

然后变量x本身占用足够的空间用于引用(通常为4或8个字节)。现在,如果你有:

x = new Object();

创建一个对象 - x的值现在是对新创建的对象的引用。 x本身占用的空间与以前相同,但也有对象本身所需的空间(基本上是字段,对象类型的引用,以及同步和房屋的数据) -keeping)。

答案 1 :(得分:2)

当您执行类似

的操作时
Object object = new Object()

在Java中,object是对托管堆上实际实例的引用。与C ++相比,那是粗略的做法

Object* object=new Object()

所以当你这样做时

Object object; 

在Java中,为实例的“引用”创建了一个位置。 与

类似
Object* object;

在C ++中。

答案 2 :(得分:1)

Object foo=null;

在C ++的含义中为对象类的对象创建了引用foo。因此,它仅消耗内存以供参考。

Object realFoo=new Object();

使用此对象的任何内容创建此类引用以及真实对象。因此,它是参考和对象本身的内存。

在Java中没有内存预留 - 只有内存分配。

答案 3 :(得分:0)

声明保留内存:方法内的参数和变量将在堆栈帧中为它们保留内存。

分配内存:在运行时,执行" new"时,将为堆上的新对象分配内存

答案 4 :(得分:0)

了解在Java中,Object object只是名为Object的{​​{1}}的引用,这一点非常重要。如果您熟悉C ++,可以将此引用视为指针(虽然它不完全相同)。

在64位计算机上,object引用为8个字节。当您使用object关键字实际实例化Object并将其分配给引用时,这就是为new分配内存的位置。