【问题标题】:What occurs when object is created in Java?在 Java 中创建对象时会发生什么?
【发布时间】:2013-06-12 05:52:40
【问题描述】:

我的老师给了我一个问题:

“在 Java 中创建对象时会发生什么”。

据我所知,内存分配、变量初始化和构造函数方法调用发生在创建对象时。

但是我的老师说我几乎是对的。后面的 2 件事都是对的,除了内存堆。相反,他说内存分配发生了。我认为该对象存储在堆中,所以我的老师错了。你认为是吗?

【问题讨论】:

  • 正如目前所写的那样,您的答案和老师的答案都说发生了内存分配。目前尚不清楚,它们在哪些方面有所不同。您写了“内存堆除外”,但两个答案中都没有出现“内存堆”一词。

标签: java object memory


【解决方案1】:

与往常一样,为这类问题找到解决方案的最佳位置是在 Java 语言规范中。

具体从the section on new instance creation可以理解为这是新建对象时的顺序,只要不出现异常即可:

  1. 内存已分配。
  2. 字段为initialized to their default values
  3. 调用所选构造函数的“第一行”,除非它是Object。第一行是指either explicit call to super() or this(), or an implicit call to super()
  4. instance initializer 被执行,fields are initialized to their requested values(实际上字段初始化通常编译为实例初始化程序的内联部分)。
  5. 其余的构造函数代码被执行。

现在,您的老师有可能将内存分配作为实际的操作系统调用来讨论 - 在这种情况下,他是对的,因为 JVM 管理自己的堆,因此 Java 内存分配不一定会转换为一个操作系统内存分配调用(虽然它可能)。

【讨论】:

    【解决方案2】:

    我会用一个简单的例子来回答这个问题。

    假设你有一个班级Car。现在你写:

    Car car;
    car = new Car();
    

    第一条语句在stack中创建了一个带有carreference

    在第二条语句中,Car 类将被加载到主内存中,然后它将为堆中的Car 的成员分配内存。发生这种情况时,成员将使用 JVM 提供的值进行初始化。

    【讨论】:

      【解决方案3】:

      当 JVM 运行程序时,每当创建一个新对象时,JVM 都会为该对象保留作为堆的一部分(该对象将存储在其中)。保留的堆数量取决于对象的大小。

      JVM 在堆中映射出这个段来表示正在存储的对象的所有属性。对象的引用(堆中的地址)由 JVM 保存并存储在一个表中,该表允许 JVM 跟踪已在堆上分配的所有对象。 JVM 稍后使用这些引用来访问对象(当程序访问对象时)。

      【讨论】:

        【解决方案4】:

        除了其他人所说的之外,如果这是第一次使用该对象,那么它的类必须被初始化 - 如 JLS 中所述(在新实例创建之前的部分!)。

        这主要涉及将有关类的必要信息加载到内存中,即为静态变量和方法表创建一个Klass 对象。这也可能涉及加载超类和接口。这一切都由ClassLoader进行。

        【讨论】:

          【解决方案5】:

          当在java中创建对象时,这6个步骤将一一发生--- 1.JVM为引用变量分配8个字节的内存,并将默认值赋值为null。

          1. JVM会验证类加载是否完成,如果类已经加载则忽略,否则执行类加载。
          2. 在类加载时,如果有任何静态变量,则会分配内存。
          3. 通过使用 new 运算符,对象内存将在堆内存中创建。
          4. 在创建对象时,如果有任何实例变量,那么这些变量将在对象内存中分配内存。
          5. 它将对象内存地址分配给首先创建的引用变量。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-09-29
            • 1970-01-01
            • 2013-10-13
            • 2015-02-04
            • 1970-01-01
            • 2021-05-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多