对象创建过程

对象创建过程(对内存分配进行了细化)
对象创建主要分六步:1.类加载,2.检查加载,3.内存分配,4.内存空间初始化,5.对象头设置,6.对象初始化(执行init方法)。我画的这张流程图对内存初始化进行了细化。
内存分配方式?
内存分配有两种方式:指针碰撞和空闲列表。判断使用哪种方式的依据是,内存是否规整,内存是否规整由收集器的收集算法来确定,如果为标量清除算法内存便不是规整的,如果为标量整理或标量复制算法,内存便为规整的。
指针碰撞
指针碰撞就是在内存中加入一个指针概念,分配到那个位置,就将指针移动到哪个位置。获取内存时,直接找到指针所在位置,然后指针后退一格就可以了。

空闲指针
空闲列表
空闲列表就是维护了一个列表,这个列表中记录了空闲中的内存空间,每次申请内存直接找到这个列表,在列表中拿一个内存地址就可以了,内存销毁时,再将销毁的内存地址放回空闲列表中。

空闲列表
如何保证并发安全?
上述两种方式,都可以看出并发安全问题,为了解决这个问题,JVM给出了两种解决方式,一种是TLAB(Thread Local Allocation Buffer),一种是CAS(Compare And Swap)。
TLAB(Thread Local Allocation Buffer)
在线程创建时,堆会为每一个线程单独划分出一片区域,这片区域就是TLAB,TLAB是非线程共享的区域,所以便避免了并发问题。
CAS(Compare And Swap)
TLAB区域的空间是有限的,在超出后便会使用CAS来规避并发问题,线程会在占用内存前再次判断当前内存地址是否还是空闲状态,如果不为空闲状态,便会重新拿取新的内存地址,循环这个过程,直到占用到空闲内存为止。