JVM创建对象过程

1. 类加载检查 (Loading & Init Check)

  • 动作 :检查 new 指令的参数是否能在元空间(方法区)定位到一个类的符号引用。
  • 核心逻辑 :确认这个类是否已经走完了"加载、验证、准备、解析、初始化"全过程。如果没有,必须先执行类加载
  • 产物:确保"模具"(类元数据)在元空间里是可用的、绿灯状态的。

2. 分配内存 (Memory Allocation)

  • 动作 :在 Java 堆 中划出一块确定大小的内存给新对象。
  • 关键技术
    • 指针碰撞 (Bump the pointer):内存规整时使用。
    • 空闲列表 (Free list):内存碎片化时使用。
    • TLAB (Thread Local Allocation Buffer):为了解决并发安全,每个线程先在自己的"小私库"里领地。

3. 零值初始化 (Zeroing Out)

  • 动作 :将分配到的内存空间(不包括对象头 )都初始化为零值(如 int0booleanfalse,引用类型为 null)。
  • 意义:这保证了 Java 对象的实例字段在代码层不赋初值也能直接使用。这就是为什么你在类里定义的成员变量有默认值,而方法里的局部变量不赋值就会报错的原因。

4. 设置对象头 (Setting Object Header)

  • 动作:填写对象的"身份证"。
  • 内容
    • Mark Word:哈希码、GC 分代年龄、锁状态标志。
    • Klass Pointer:指向元空间里类元数据的指针。
  • 物理意义:此时,这个内存块真正变成了一个"有身份"的 Java 对象。

5. 对象初始化 (Executing <init>)

  • 动作:执行程序员写的构造函数、代码块,为成员变量赋上真正的业务初始值。
  • 执行顺序 :父类变量初始化 →\rightarrow→ 父类构造器 →\rightarrow→ 子类变量初始化 →\rightarrow→ 子类构造器。
  • 最终状态:此时,对象才真正按照你的意图"装修"完毕,可以投入使用了。
相关推荐
咖啡八杯1 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育1 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵2 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔3 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
SeaTunnel3 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影4 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Marst Code4 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
Miao121314 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔5 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
CRMEB系统商城6 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源