java对象的创建过程:
对象内存分配:
类被加载后就可以开始为对象分配内存了,也就是在堆中划分一块区域给该对象,分配的方式有指针碰撞和空闲列表,指针碰撞的方式就是采用连续的空间进行对象内存分配,左边都是已分配内存,右边都是空闲内存,中间是一个指针用于分隔;空闲列表就不是连续的内存了,需要维护一个映射表存储了哪些区域已用哪些区域空闲。采用何种方式取决于使用的垃圾收集器,目前CMS收集器采用的时空闲列表,其他如Serial Parallel等收集器都是采用的指针碰撞。
由于堆是由线程共享的,所以分配堆内存这个过程并不线程安全,对此有两种方式,一种是采用同步的方式进行分配(CAS加失败重试),一种是为每个线程分配一块区域,只有在不够用时才需要同步的分配更大的内存
设置对象运行时的一些必要信息:
在完成内存分配后,需要对对象进行一些必要的设置,比如对象属于哪个类的实例,对象的GC分代年龄,对象的hash码,锁相关的信息,这些信息存储在对象的对象头之中
执行init方法(实例构造器):
将对象按照程序员的希望进行初始化,这样一个完整可用的对象才算被创建出来,
编译期间虚拟机会收集类中对成员变量的赋值语句以及代码块中的语句合并为init方法(包括声明成员变量时指定的初始值,构造方法中、代码块中的赋值行为),init方法中会显式的去调用父类的构造器
至此,一个对象就完成了它的创建过程,可以被正常使用了