对象实例化
Java是面向对象的静态强类型
语言,我们一般先声明并创建对象,根据某个类声明一个引用变量指向被创建的对象,并使用此引用变量操作该对象,如Object obj = new Object()
,obj 即引用变量
,也叫实例成员变量
。下面通过简单地从执行步骤的角度来分析:
确定类元信息是否存在
。当JVM接受到new
指令时,首先在metaspace
内检查需要创建的类元信息
是否存在。若不存在,那么在双亲委派
模式下,使用当前类加载器
以ClassLoader + 包名 + 类名
为Key进行查找对应的.class文件。如果没有找到文件,则抛出ClassNotFoundException
异常;如果找到,则进行类加载,并生成对应的Class类对象。分配对象内存
。首先计算对象所占用空间的大小,如果实例成员变量是引用变量,仅分配引用变量
即可,即4个字节大小,接着在堆中划分一块内存给新对象。在分配内存空间时,需进行同步操作
,比如采用CAS
(Compare And Swap)失败重试
、区域加锁
等方式保证分配操作的原子性
。设定默认值
。成员变量值都需要设定为默认值,即各种不同形式的零值
。设置对象头
。设置新对象的哈希码
、GC信息
、锁信息
、对象所属的类元信息
等。具体的设置方式取决于JVM实现
。执行init方法
。初始化成员变量
,执行实例化代码块
,调用类的构造方法
,并把堆内对象的首地址赋值给引用变量
。