谈谈创建对象的过程
Java 虚拟机遇到 new 指令时,对象创建流程并非一步到位,通常需要经过以下 6 个步骤:
# 1. 类加载检查 (Class Loading Check)
JVM 会检查这个类是否已被加载(Load)、链接(Link)和初始化(Initialize)。
- 如果类尚未加载,则必须先执行相应的类加载过程。类加载机制
# 2. 内存分配 (Memory Allocation)
对象所需内存大小在类加载完成后便确定了,接下来就是从 Java 堆(Heap) 中划分一块足够的空间给新对象。
- 划分方式:
- 指针碰撞(Pointer Bumping):如果堆内存是规整的(如使用 Mark-Compact 算法),只需移动指针。
- 空闲列表(Free List):如果堆内存是不连续的,则需要在列表中找到足够大的空闲块。
- 并发处理 (Concurrency Handling):由于对象创建非常频繁,多线程同时分配内存可能导致分配指针冲突,JVM 通常采用两种方式解决:
- CAS (Compare-and-Swap):对分配动作加锁,失败了重试。
- TLAB (Thread Local Allocation Buffer):为每个线程预先在 Eden 区划分一块专属的私有空间。线程优先在自己的 TLAB 上分配,用完了再申请新的 TLAB。
# 3. 初始化为零值 (Zero Initialization)
分配到的内存空间(不包括对象头)会被统一初始化为零值(例如 int 为 0,boolean 为 false,引用为 null)。
- 目的:确保对象的实例字段在 Java 代码中即使没有赋初值,也可以直接使用对应的零值。
# 4. 设置对象头 (Object Header Setup)
JVM 会设置新对象的对象头(Header),主要包含两部分信息:
- 运行时元数据(Mark Word):包括哈希码、GC 年龄、锁状态标志位(偏向锁、轻量级锁等)。
- 类型指针:指向该对象所属类的元数据(让 JVM 知道这个对象是哪个类的实例)。
# 5. 执行构造函数 ( 方法)
执行 Java 代码中的 <init> 方法(即我们定义的构造函数)。
- 执行构造函数是为了给对象的实例字段赋予程序期望的初始值,这个阶段才是真正的初始化。
# 6. 返回对象引用
至此,一个对象创建完成。JVM 将创建好的对象引用(Reference)赋值给程序中的变量,供后续使用。

上次更新: 2025-12-04 03:34:09