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→ 子类构造器。
  • 最终状态:此时,对象才真正按照你的意图"装修"完毕,可以投入使用了。
相关推荐
Joy T38 分钟前
Spring AI 2.0 Agent 进阶:Memory、State 与 Context Engineering 常见技术全景
java·人工智能·后端·spring·agent入门·agent state
估值探索者40 分钟前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘
RAN11426760081 小时前
1.3第一个程序的介绍
开发语言·qt
天若有情6731 小时前
C++花式魔改!手写头文件复刻Java语法,彻底打破编码思维定式
java·c++·语言做语言·jac++
blue_ice .1 小时前
Verilog DDS 数字信号发生器:DAC 输出模拟波形与 ADC 回采观测
开发语言·单片机·嵌入式硬件·fpga开发
远翔调光芯片^138287988722 小时前
ECP5702能芯科技PD取电芯片在市场上的优势有哪些?
开发语言·人工智能·单片机·嵌入式硬件·智能家居
西峰u2 小时前
Java单例模式|从基础到多线程安全
java·java单例模式
ClinicTech2 小时前
实验室洗瓶机的清洗系统架构与自动化控制解析
java·python
linmengmeng_13142 小时前
【总结】MyBatis-Plus批量插入与清表的正确姿势
java·spring boot·mysql·mybatis
木井巳3 小时前
【记忆化搜索】不同路径
java·算法·leetcode·深度优先·剪枝·推荐算法