Java对象创建本质是JVM通过new触发的标准化实例化流程,含类加载检查、内存分配、初始化与构造方法执行四阶段,每步均有规范约束和潜在问题。

Java中对象的创建,本质是通过new关键字触发JVM执行一套标准化的实例化流程。这个过程不只是简单分配内存,而是涉及类加载、内存分配、初始化等多个阶段的协同,每一步都有明确的规范和潜在的细节影响。
类加载检查:对象类型是否就绪
当JVM遇到new指令时,首先检查常量池中是否已有该类的符号引用;如果没有,就启动类加载机制(加载、验证、准备、解析、初始化);如果已加载且通过验证,则继续下一步。这一步确保了类定义可用、结构合法、静态内容已就绪。
- 若类尚未加载,会触发完整的类加载流程,包括执行
方法(静态代码块和静态变量赋值) - 若类加载失败(如
NoClassDefFoundError或ClassNotFoundException),对象创建直接终止 - 注意:
new不会重复触发类初始化——类只会被初始化一次,即使多次创建实例
内存分配:在堆中划出一块空间
类加载检查通过后,JVM在堆内存中为新对象分配固定大小的内存空间。分配方式取决于垃圾收集器和堆内存布局:
- 指针碰撞(Bump the Pointer):适用于规整的堆内存(如Serial、ParNew配合CMS),移动空闲指针即可完成分配
- 空闲列表(Free List):适用于不规整的堆(如使用标记-整理算法后),需从维护的空闲块列表中查找合适大小的空间
- 分配过程必须保证线程安全,常用方式有CAS+失败重试,或为每个线程分配独立的TLAB(Thread Local Allocation Buffer)
内存初始化与对象头设置
分配到的内存空间会被清零(不包含对象头),确保所有字段初始值符合Java规范(如int为0、Object为null)。接着JVM设置对象头,包含两部分信息:
本书全面介绍PHP脚本语言和MySOL数据库这两种目前最流行的开源软件,主要包括PHP和MySQL基本概念、PHP扩展与应用库、日期和时间功能、PHP数据对象扩展、PHP的mysqli扩展、MySQL 5的存储例程、解发器和视图等。本书帮助读者学习PHP编程语言和MySQL数据库服务器的最佳实践,了解如何创建数据库驱动的动态Web应用程序。
立即学习“Java免费学习笔记(深入)”;
- Mark Word:存储哈希码、GC分代年龄、锁状态标志、线程持有的锁等运行时数据
- 类型指针:指向该对象所属类的元数据(即Klass Pointer),用于确定对象是哪个类的实例(开启指针压缩时可能存放在其他位置)
- 如果是数组,还会额外记录数组长度
执行构造方法:真正赋予对象行为与状态
内存初始化完成后,JVM调用对应的方法(即你写的构造函数),按以下顺序执行:
- 先调用父类构造器(隐式或显式
super()),逐层向上直到Object - 执行本类成员变量的显式初始化(如
private int x = 10;) - 执行本类构造器中的代码块和语句
- 注意:此时对象才真正“活”起来——字段被赋予业务含义,方法可被调用,但对其他线程仍不可见(除非正确发布)
整个流程看似自动,但理解它有助于排查内存溢出、类加载异常、指令重排序、未完全初始化对象逃逸等问题。不复杂但容易忽略。









