java对象创建过程分为五步:类加载检查确保类已初始化;内存分配依gc策略选指针碰撞或空闲列表,并通过tlab或cas解决并发;零值初始化字段;设置对象头含mark word和klass pointer;最后执行方法完成字段赋值、实例块和构造体。

Java 对象的创建过程本质是 JVM 在运行时将代码中的 new 指令转化为堆中一个可访问、可管理的实体。整个过程不是原子操作,而是分阶段协同完成,核心围绕“类可用、空间够、状态清、头设好、逻辑跑”五个关键环节展开。
类加载检查:确保模板就绪
JVM 遇到 new 指令后,第一件事是查常量池里的符号引用能否定位到目标类,并确认该类是否已完成加载、验证、准备、解析和初始化。若未完成,会触发类加载子系统(如双亲委派机制)去读取 .class 文件、生成类元数据并存入方法区。只有类结构确定了,JVM 才能知道对象需要多大内存、字段布局如何——这是后续分配的前提。
内存分配:按堆状态选策略
类信息完备后,JVM 在堆中划分指定大小的空间。具体方式取决于垃圾收集器导致的堆内存形态:
- 指针碰撞(Bump the Pointer):适用于 Serial、ParNew 等带压缩整理能力的 GC。堆内存规整,已用与空闲区域泾渭分明,仅需移动一个“边界指针”即可完成分配,极快且无碎片。
- 空闲列表(Free List):适用于 CMS、G1(部分场景)等不保证内存连续的 GC。堆内存碎片化,JVM 维护一张记录可用块起始地址与大小的链表,分配时遍历查找合适区块,开销略高但更灵活。
无论哪种方式,JVM 都需解决多线程并发分配问题:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 默认启用 TLAB(Thread Local Allocation Buffer):每个线程在 Eden 区预分配一小块私有内存,对象优先在 TLAB 中分配,几乎无锁;TLAB 耗尽时再同步竞争 Eden 公共空间。
- 公共区域分配则依赖 CAS(Compare-and-Swap)+ 失败重试,保证指针更新或列表修改的原子性。
初始化与对象头设置:赋予初始语义
内存划出后,JVM 立即执行两步基础初始化:
-
零值初始化:将实例字段所在内存区域(除对象头外)全部置为默认值(
int→0、boolean→false、reference→null),使字段即使未显式赋值也能安全读取。 - 设置对象头:填充 Mark Word(含哈希码、GC 年龄、锁标志位等)和 Klass Pointer(指向方法区中的类元数据),让对象具备身份识别、锁管理和类型反射能力。
构造方法执行:<init></init> 完成业务初始化
最后一步才是程序员可见的逻辑起点:调用 invokespecial 指令执行 <init></init> 方法。它按顺序执行:
- 字段显式赋值(如
private int x = 5;) - 实例代码块(
{ ... }) - 构造函数体内容
此时对象才真正具备业务语义,引用变量也正式指向堆中这个完整实例。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










