Skip to content

对象创建流程

对象创建是面向对象编程中的核心过程,以下是对象创建的主要流程(以 Java 为例,其他语言类似):

1. 类加载检查

  • 目的:确保类已加载到 JVM 中。
  • 过程
  • 检查类是否已加载、链接和初始化。
  • 若未加载,执行类加载过程:加载、验证、准备、解析、初始化。
  • 类加载机制确保类只加载一次。

2. 分配内存

  • 目的:为对象在堆内存中分配空间。
  • 方式
  • 指针碰撞:堆内存规整时,移动指针分配空间。
  • 空闲列表:堆内存不规整时,使用空闲列表记录可用内存块。
  • 并发处理
  • 使用 CAS(比较并交换)或 TLAB(线程本地分配缓冲区)确保线程安全。

3. 初始化零值

  • 目的:确保对象字段有默认初始值。
  • 过程:将分配的内存空间初始化为零值(如 int 为 0,Stringnull)。

4. 设置对象头

  • 目的:存储对象元数据。
  • 内容
  • Mark Word:存储哈希值、GC 分代年龄、锁状态等。
  • Klass Pointer:指向类元数据的指针。
  • 数组长度(若为数组):记录数组长度。

5. 执行构造方法

  • 目的:对对象进行自定义初始化。
  • 过程
  • 调用类的构造方法,初始化字段或执行其他操作。
  • 若有父类,先调用父类构造方法。
  • 注意
  • 构造方法无返回值。
  • 未定义构造方法时,编译器生成默认无参构造方法。

6. 返回对象引用

  • 目的:将新对象引用返回给调用者。
  • 过程:返回指向堆中新对象的引用,供调用者访问对象。

示例代码 (Java)

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {
        Person person = new Person("Alice", 30); // 对象创建
        System.out.println(person.name + ", " + person.age);
    }
}

注意事项

  • 内存泄漏:未释放的引用可能导致内存泄漏。
  • 构造方法重载:可定义多个参数不同的构造方法。
  • 单例模式:控制对象创建数量。
  • 对象池:复用对象以提升性能。

总结

对象创建涉及类加载、内存分配、初始化等步骤,理解这些过程有助于优化代码和理解 JVM 工作原理。