Java 对象的内存预留

Memory reservation for java objects

本文关键字:内存 对象 Java      更新时间:2023-10-16

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

Object object

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

object = new Object()

被写了。我想具体知道何时为对象提供内存。我认为构造和新关键字都分配了内存,因此Object object = new Object()似乎是多余的。我在 Oracle 的网站上读到声明"保留"内存和新的"分配"内存,我想知道两者之间有什么区别。

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

Object x = null;

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

x = new Object();

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

当你做类似的事情时

Object object = new Object()

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

Object* object=new Object()

所以当你这样做时

Object object; 

在 Java 中,为实例的"引用"创建了一个位置。似

Object* object;

在C++。

Object foo=null;

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

Object realFoo=new Object();

创建这样的引用,并且还创建与此对象相同的真实对象。因此,它是引用和对象本身的内存。

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

声明保留

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

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

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

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