Java对象的创建过程
创建过程大致分成五步:
- 类加载检查
- 分配内存
- 初始化零值
- 设置对象头
- 执行init
接下来详细说明每一步执行的具体操作。
- 类加载检查
首先检查这个指令能够在常量池中定位一个类的符号引用
接着回去检查这个符号引用代表的类是否已经被加载、解析、初始化,如果没有的话那么会进行累加载的过程。
进行类加载之后就是分配内存了,类加载完成之后就可以确认类加载所需要的内存。
- 分配内存
通俗来说就是给新创建的对象分配内存,现在分配内存有两种方式,分别是指针碰撞和空闲列表。
首先指针碰撞指的是内存分配是在连续的内存空间中进行的。我们已经知道了对象使用的内存大小,直接在原来的末尾进行增加对应大小的内存就可以。第二种是空闲列表,对应于内存空间不连续的情况,那么就需要有一个表用来记录当前那个内存空间是空闲的,哪个空间是已经被使用的,内存分配的时候直接在表上进行申请就可以了。 - 初始化零值
在分配完内存之后,虚拟机必须将分配到的内存空间都初始化成零值。这主要有两个原因,一方面是可以避免当前的内存空间有脏数据,另外一个原因是保证对象在创建的时候能够让Java代码在不赋值的时候可以直接访问使用,这样就可以使Java程序访问对应的数据类型的默认值。
比如我们知道的int的默认值是0 boolean 的默认值是false。 - 设置对象头
之后,Java虚拟机还需要对这些对象进行必要的设置,例如设置对象对应的类,对象的哈希码,对象的GC年龄等等,是否使用偏向锁等等。 - 执行init
执行完上述的操作之后,对于虚拟机来说当前的对象已经创建完成了,但是现在对于Java视角来说还没有完成,所有的值都是默认值,还没有设置成用户设置的值,所以最后还会执行init方法执行对象的初始化。
最终完整的对象才被构建出来。