回答
Java 对象的创建过程分为 5 个步骤:
- 类加载检查:在创建对象之前,JVM 需求确保该对象的类已经加载并且被初始化了。
- 分配内存:类加载检查通过后,JVM 就会为新建的对象分配内存。对象所需的内存大小在类加载阶段就已经知道了。
- 初始化零值:在为对象分配内存后,JVM 会自动将这块内存初始化为零值,比如数值类型初始化为
0
,引用类型初始化为null
。 - 设置对象头:每个对象都需要知道它的类型信息,因此 JVM 会为每个对象设置对象头信息。对象头包含两部分内容,第一部分是用于存储对象自身的运行时数据,如hashcode、GC分代年龄、锁状态标志、线程持有的锁等;第二部分是类型指针,指向它对应的类元数据,JVM 用这个确定其属于哪个类的实例。
- 调用构造方法:最后一步,JVM 会通过
new
指令调用对象的构造方法。
详解
类加载检查
在创建对象之前,JVM 需要确保该对象的类已经完成了加载。在这个过程中,JVM 会去检查这个类是否在常量池中能定位都一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和完成初始化。如果没有,则先执行类的加载流程。
关于类加载流程请阅读面试题:你知道类的生命周期吗?
为什么在创建对象时,要有一个这样的检查呢?主要是因为类的加载,通常都是懒加载,只有当使用类的时候才会加载。