java对象创建需经类加载检查、内存分配(指针碰撞/空闲列表/tlab)、零值初始化、设置对象头、执行构造方法五步;类未就绪则终止,内存分配兼顾效率与线程安全,零值初始化保障字段安全读取,对象头支持运行时功能,构造方法完成业务逻辑初始化。

Java 中对象创建不是简单的一次内存申请,而是 JVM 协调类加载、空间划分、线程安全与初始化的完整流程。核心在于:类必须先就位,内存必须分得准、分得稳、初始化得全。
类加载检查是前提
执行 new 指令时,JVM 第一时间查常量池里的符号引用,确认该类是否已完成加载、验证、准备、解析和初始化。未加载则触发双亲委派机制加载;加载失败直接抛异常,对象创建终止。没有类元数据,对象无从谈起。
内存分配靠堆结构与并发策略
类信息确定后,JVM 精确计算对象大小,在堆中划出对应空间。具体方式取决于垃圾收集器行为:
- 指针碰撞法:适用于 Serial、Parallel 等带压缩能力的收集器。堆内存规整,已用/空闲区域分明,仅移动一个指针即可完成分配,极快且无碎片。
- 空闲列表法:适用于 CMS、G1 等不保证内存规整的收集器。需维护可用内存块列表,分配时遍历查找合适块,速度较慢但适应碎片化场景。
- 并发安全靠 CAS + TLAB:多线程同时 new 会争抢内存分配点。JVM 默认启用 TLAB(线程本地分配缓冲),每个线程独占一小块堆空间,优先在本地分配,避免锁竞争;TLAB 耗尽时再用 CAS 原子操作更新公共指针,失败则重试。
初始化零值与对象头设置不可跳过
内存分配后,JVM 立即把实例字段所在区域(不含对象头)全部设为零值——int 变 0、boolean 变 false、引用变 null。这使得字段即使没显式赋值也能安全读取。
紧接着设置对象头,包含两关键部分:
- Mark Word:存哈希码、GC 分代年龄、锁状态标志等运行时数据;
- Klass Pointer:指向方法区中该对象所属类的元数据,用于类型判断和方法查找。
构造方法执行完成最终初始化
以上步骤完成后,JVM 才调用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











