对象的内存分配

对象创建过程


对象创建过程(对内存分配进行了细化)

对象创建主要分六步: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来规避并发问题,线程会在占用内存前再次判断当前内存地址是否还是空闲状态,如果不为空闲状态,便会重新拿取新的内存地址,循环这个过程,直到占用到空闲内存为止。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容