java 个对象的内存预留

Memory reservation for java objects

我知道在 C++ 中声明对象实例时是这样的:

Object object

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

object = new Object()

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

您需要区分 变量 所需的 space 和 对象 所需的 space ].请记住,变量的值只是一个引用——非常像 C++ 中的指针。所以如果你有:

Object x = null;

然后变量x本身占用足够space作为引用(通常是4或8个字节)。现在如果你有:

x = new Object();

创建对象 - x 的值现在是对新创建对象的引用。 x 本身占用与以前相同数量的 space,但对象本身也需要 space(基本上是字段、对象类型的引用和数据用于同步和管理)。

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

分配内存:在运行时,执行"new"时,会在堆上为新的Object分配内存

当你做类似

的事情时
Object object = new Object()

在Java中,对象是对托管堆上实际实例的引用。与C++相比,大致就是这样

Object* object=new Object()

所以当你

Object object; 

在Java中,为'reference'实例创建了一个地方。 类似于

Object* object;

在 C++ 中。

了解 Java 中的 Object object 只是对 objectObject 引用 很重要。如果您熟悉 C++,您可以将此引用视为指针(尽管它并不完全相同)。

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

Object foo=null;

在 C++ 的含义中创建对 class 对象的对象的引用 foo。所以,它消耗内存仅供参考。

Object realFoo=new Object();

用这个对象的任何东西创建这样的引用和真实的对象。因此,它是引用和对象本身的内存。

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