无锡做企业网站的公司,网站定制化服务,遂宁市做网站的公司,jsp实战网站开发视频指针碰撞空闲列表TLAB
为对象分配空间的任务实际上便等同于把一块确定大小的内存块从Java堆中划分出来。
指针碰撞#xff1a;#xff08;Bump The Pointer#xff09; 堆的内存是绝对规整的#xff0c;内存主要分为两部分#xff0c;所有使用过的内存被放在一边#x…指针碰撞空闲列表TLAB
为对象分配空间的任务实际上便等同于把一块确定大小的内存块从Java堆中划分出来。
指针碰撞Bump The Pointer 堆的内存是绝对规整的内存主要分为两部分所有使用过的内存被放在一边空闲的内存被放在另一边中间放着一个指针作为分界点的指示器分配空间的时候仅仅把指针向空闲方向挪动一段与对象大小相等的距离。
实现简单多线程下效率不高CAS失败重试的形式完成的。
空闲列表(Free List) 如果堆的内存并不是规整的已被使用的内存和空闲的内存相互交错在一起那就没有办法简单地进行指针碰撞了虚拟机就必须维护一个列表记录上哪些内存块是可用的在分配的时候从列表中找到一块足够大的空间划分给对象实例并更新列表上的记录。
有空间碎片的问题
两种方式的选择由 Java 堆是否规整决定Java 堆是否规整是由选择的垃圾收集器是否具有压缩整理能力决定的。
并发情况下线程不安全在给A分配内存指针没有来得及修改对象B又使用了原来的指针分配内存解决方式
CAS失败重试保证操作的原子性TLAB 每个线程在Java堆中预先分配一小块内存称为本地线程分配缓冲哪个线程要分配内存就在哪个线程的本地缓冲区中分配只有本地缓冲区用完了分配新的缓存区时才需要同步锁定。