1.首先说一下对象创建的几步流程:
对象创建的主要流程:
1.类加载检查
虚拟机遇到一条new指令时,首先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用并且检查这个符号引用代表的类是否被加载,解析,初始化过,如果没有,那必须执行相应的类加载过程
new 的指令对应到语言层面上讲: new关键词,对象克隆,对象序列化等
2.分配内存
在类加载检查通过后,接下来虚拟机将为新生对象分配内存,对象所需内存的大小在类加载完成后便可完成确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来
3.初始化零值
内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值()不包括对象头
4.设置对象头(分不同的操作系统,如32位的,64位的)
初始化零值之后,虚拟机要对对象进行必要的设置,例如这个对象是哪个的实例,如何才能找到类的元数据信息,对象的哈希码,对象的GC分代年龄等这些信息,这些信息存放在对象的对象头Object Header之中
在HotSpot虚拟机中,对象在内存中的储存布局可以分为3块区域: 对象头(Header),实例数据(Instance Data)和对齐填充(Padding)
HotSpot虚拟机的对象头包括两部分信息:
第一部分: 储存对象本的运行时数据,如哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳等
第二部分: 类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例
如下是32 位的对象头
5.执行init()方法
即对象按照程序员的意愿进行初始化;对应到语言层面来讲,就是属性赋值(注意:这是程序员自己赋的值)和执行构造方法