1检测类是否被加载
虚拟机遇到对象的创建
首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过(类的加载过程)。
如果没有,那必须先执行相应的类加载过程。
2为新生对象分配内存
通过计算对属性计算在堆中分配空间。空间大小固定且不再更改。
由对象头,对象数据,补位码(每个对象位数都是8的倍数,不够的需要有补位码补位)三部分组成。
补充:
空间规整的情况下,在堆中使用指针碰撞
空间不规整的情况下,维护空闲列表,记录每一块的大小。使用空闲列表。
空间是否规整取决于垃圾回收器(GC的回收算法)
3初始化零值
将对象中所有非static属性赋予初值。
避免构造函数没有对所有属性进行赋值。
4进行必要的设置
虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。这些信息存放在对象的对象头之中。
5执行init方法
执行构造函数,对对象属性进行赋值。
补充:
方法的调用/调用
创建一个虚函数表(指针数组)(堆中/还是常量池),其中的指针指向某个类的具体成员函数实现。为每一个类创建一个虚函数表的实例,并在每个对象中保存一个指向虚函数表的指针。