类加载并初始化
在实例化一个对象的时候,JVM 首先会去检查目标对象是否已经被加载并初始化了。
如果没有,JVM 需要立刻去加载目标类,然后调用目标类的构造器完成初始化。 目标
类的加载是通过类加载器来实现的,主要就是把一个类加载到内存里面。然后初始化的过程,主要是对目标类里面的静态变量、成员变量、静态代码块进行初始化
分配内存空间
当目标类被初始化以后,就可以从常量池里面找到对应的类元信息,并且目标对象的大小在类加载之后就已经确定了,所以这个时候就需要为新创建的对象,根据目标对象的大小在堆内存里面分配内存空间。内存分配的方式一般有两种,一种指针碰撞,另一种是空闲列表,JVM 会根据 Java 堆内存是否规整来决定内存分配方式。
初始化对象
接下来,JVM 会把目标对象里面的普通成员变量初始化为零值,比如 int 类型初始化为0,对象类型初始化为 null,(类变量在类加载的准备阶段就已经初始化过了)。
这一步操作主要是保证对象里面的实例字段,不用初始化就可以直接使用,也就是程序
能够获得这些字段对应数据类型的零值。
然后,JVM 还需要对目标对象的对象头做一些设置,比如对象所属的类元信息、对象的 GC 分代年龄、hashcode、锁标记等等。
执行init方法
完成这些步骤以后,对于 JVM 来说,新对象的创建工作已经完成。但是基于 Java 语言
来说,对象创建才算是开始。 接下来要做的,就是执行目标对象内部生成的 init 方法,初始化成员变量的值、执行构造块、最后执行目标对象的构造方法,完成对象的创建。 其中,init 方法是 Java 文件编译之后在字节码文件中生成的,它是一个实例构造器,这个构造器会把语句块、变量初始化、调用父类构造器等操作组织在一起。所以调用 init方法能够完成一系列的初始化动作
