对象的创建过程

在 Java 中,对象的创建主要由 new 指令触发,JVM 会经历以下几个步骤完成整个创建过程:

1. 类加载检查

  • 当虚拟机遇到一条 new 指令时,首先会去常量池中检查该指令参数所引用的类符号引用。
  • 如果目标类没有被 加载(Loading)连接(Linking)初始化(Initialization),JVM 会触发相应的类加载过程。
  • 只有类加载完成,才能继续创建对象。

2. 分配内存

  • 类加载成功后,JVM 会为对象分配内存。
  • 分配的内存大小,在类加载阶段就已确定。
  • 分配的内存来自于 Java 堆(Heap)。

内存分配方式

内存分配的具体方式有两种,取决于 Java 堆是否规整

👉 指针碰撞(Bump-the-pointer)
  • 适用场合:堆内存规整(没有碎片)的情况。
  • 原理:所有已使用内存集中在一边,未使用内存集中在另一边,中间有一个分界指针。
  • 分配过程:只需将分界指针向未使用方向移动一段对象大小即可。
  • 适用的 GC 收集器SerialParNew
👉 空闲列表(Free-list)
  • 适用场合:堆内存不规整(有碎片)的情况。
  • 原理:JVM 维护一个空闲内存块列表,记录哪些块是可用的。
  • 分配过程:遍历空闲列表,找到一块足够大的内存分配给对象,并更新列表。
  • 适用的 GC 收集器CMS

3. 初始化零值

  • 分配到内存后,JVM 会将对象的 实例字段 初始化为零值(默认值)。

  • 注意:不包括对象头,对象头会在下一步设置。

  • 这样保证了即使用户没有显式赋初值,Java 程序仍可访问字段的默认值。

    • 数值类型(如 int、long)→ 0
    • 浮点类型(float、double)→ 0.0
    • 布尔类型 → false
    • 引用类型 → null

4. 设置对象头(Object Header)

  • JVM 接下来会设置对象头信息,主要包括:

    • 类的元数据信息指针:指向对象所属类的 Class 实例(方法区中的类型信息)。
    • 哈希码(HashCode)
    • GC 分代年龄
    • 锁标志位(如偏向锁、轻量级锁等)
  • 对象头结构会根据虚拟机运行时的锁策略不同而发生变化。


5. 执行 <init> 构造方法

  • 上述步骤完成后,JVM 从自己的视角认为"对象已创建",但对 Java 程序而言,对象还未初始化。
  • 因此会调用该类的构造方法 <init> 进行用户定义的初始化。
  • 执行完 <init> 方法后,对象才真正可用。

总结:对象创建全过程图解

graph TD A[执行 new 指令] --> B{类是否已加载} B -- 是 --> C[分配内存] B -- 否 --> B1[类加载过程] --> C C --> D[初始化为零值] D --> E[设置对象头] E --> F[执行 构造方法] F --> G[对象创建完成,可用]

附加说明

  • 对象的创建是 JVM 执行最频繁的操作之一,性能优化尤为关键。

  • 对象分配过程与 GC 的设计密切相关。

  • 对象创建并非线程安全,JVM 在分配内存时必须同步,常用的方式有:

    • CAS + 失败重试
    • TLAB(Thread Local Allocation Buffer,线程本地分配缓冲区)
相关推荐
brave_zhao4 分钟前
launch4j亲测打包java的jar转为exe执行文件
java
利刃大大5 分钟前
【RabbitMQ】SpringBoot整合RabbitMQ:工作队列 && 发布/订阅模式 && 路由模式 && 通配符模式
java·spring boot·消息队列·rabbitmq·java-rabbitmq
lkbhua莱克瓦246 分钟前
进阶-存储对象1-视图
java·数据库·sql·mysql·视图
yangminlei8 分钟前
Spring Boot 自动配置原理与自定义 Starter 开发实战
java·数据库·spring boot
悟空码字10 分钟前
10分钟搞定!SpringBoot集成腾讯云短信全攻略,从配置到发送一气呵成
java·spring boot·后端
爱编程的小吴12 分钟前
【力扣练习题】151. 反转字符串中的单词
java·算法·leetcode
未来龙皇小蓝21 分钟前
Spring注入Bean流程及其理解
java·spring boot·后端·spring·代理模式
知秋正在99624 分钟前
Java实现Html保存为.mhtml文件
java·开发语言·html
码头整点薯条27 分钟前
大数据量查询处理方案
java
菜鸟233号29 分钟前
力扣474 一和零 java实现
java·数据结构·算法·leetcode·动态规划