java对象是怎么创建出来的

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

猜你喜欢

转载自blog.csdn.net/wb_snail/article/details/80597141