【问题标题】:Memory reservation for java objectsjava对象的内存预留
【发布时间】:2015-04-14 17:21:03
【问题描述】:

我知道在 c++ 中声明对象实例时像这样:

Object object

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

object = new Object()

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

【问题讨论】:

    标签: java c++ memory


    【解决方案1】:

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

    Object x = null;
    

    那么变量x 本身会占用足够的空间来进行引用(通常是 4 或 8 个字节)。现在,如果你有:

    x = new Object();
    

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

    【讨论】:

      【解决方案2】:

      当你做类似的事情时

      Object object = new Object()
      

      在 Java 中,object 是对托管堆上实际实例的引用。和C++相比,差不多就是这样

      Object* object=new Object()
      

      所以当你这样做时

      Object object; 
      

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

      Object* object;
      

      在 C++ 中。

      【讨论】:

        【解决方案3】:
        Object foo=null;
        

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

        Object realFoo=new Object();
        

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

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

        【讨论】:

          【解决方案4】:

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

          分配内存:在运行时,执行“new”时,会为堆上的新对象分配内存

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-04-15
              • 1970-01-01
              • 2011-10-14
              • 2018-02-26
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多