标签:一个 碰撞 线程安全 存在 不同的 头信息 距离 方式 内存分配
虚拟机遇到new指令时:
首先检查方法区中是否加载了类信息,如果没有加载,则先加载类信息
类加载后,为对象分配内存,大小在加载类信息时确定
如果对内存是规整的,即垃圾回收后整理内存碎片合并成一块未使用的区域则分配内存就是将记录内存位置的指针移动相应大小的一段距离(指针碰撞)
如果内存不规整,即垃圾回收后没有整理内存碎片,那么需要维护一个列表,记录内存碎片大小,分配空间时选择可用的一块(空闲列表)
同时分配内存时存在线程安全问题,即分配对象a的内存,指针还没有变化,对象b又用了该指针分配内存,解决这个问题有两种方式
1.CAS(旧值C,期望值A,新值s,当A=C时说明C值没有修改过,然后让C=S 这种方法可能引发ABA问题)+失败重试
2.把内存分配根据不同线程,将堆划分为不同的空间(TLAB 本地线程分配缓冲),哪个线程分配内存,就在哪个线程的TLAB上划分,当TLAB用完,分配新的TLAB时,采用同步方法
对象分配内存后设置头信息(对象头信息后面再做介绍)
头信息设置完成后执行初始化方法,至此对象创建完成
标签:一个 碰撞 线程安全 存在 不同的 头信息 距离 方式 内存分配
原文地址:https://www.cnblogs.com/byebyebird/p/10134657.html