2020-10-03:java中satb和tlab有什么区别?

福哥答案2020-10-03:#福大大架构师每日一题#算法

简单回答:
satb: snapshot-at-the-beginning,快照。
tlab:thread local allocation buffer,线程本地分配缓冲。架构

中级回答:
satb: snapshot-at-the-beginning,快照。
mark的过程就是遍历heap标记live object,采用的是三色标记算法,这三种颜色为white(表示还未访问到)、gray(访问到可是它用到的引用尚未彻底扫描)、black(访问到并且其用到的引用已经彻底扫描完),整个三色标记算法就是从GC roots出发遍历heap,针对可达对象先标记white为gray,而后再标记gray为black;遍历完成以后全部可达对象都是black的,全部white都是能够回收的。
SATB仅仅对于在marking开始阶段进行"snapshot"(marked all reachable at mark start),可是concurrent的时候并发修改可能形成对象漏标记,好比
①.对black新引用了一个white对象,而后又从gray对象中删除了对该white对象的引用,这样会形成了该white对象漏标记。
②.对black新引用了一个white对象,而后从gray对象删了一个引用该white对象的white对象,这样也会形成了该white对象漏标记。
③.对black新引用了一个刚new出来的white对象,没有其余gray对象引用该white对象,这样也会形成了该white对象漏标记。
对于三色算法在concurrent的时候可能产生的漏标记问题,SATB在marking阶段中,对于从gray对象移除的目标引用对象标记为gray,对于black引用的新产生的对象标记为black;因为是在开始的时候进行snapshot,于是可能存在Floating Garbage。并发

tlab:thread local allocation buffer,线程本地分配缓冲。
把内存分配的动做按照线程划分在不一样的空间之中进行,即每一个线程在 Java 堆中预先分配一小块私有内存,也就是本地线程分配缓冲(Thread LocalAllocationBuffer,TLAB),JVM 在线程初始化时,同时也会申请一块指定大小的内存,只给当前线程使用,这样每一个线程都单独拥有一个 Buffer,若是 须要分配内存,就在本身的 Buffer 上分配,这样就不存在竞争的状况,能够大大提高分配效率,当 Buffer 容量不够的时候,再从新从 Eden 区域申请一块 继续使用。
TLAB 的目的是在为新对象分配内存空间时,让每一个 Java 应用线程能在使用本身专属的分配指针来分配空间,减小同步开销。
TLAB 只是让每一个线程有私有的分配指针,但底下存对象的内存空间仍是给全部线程访问的,只是其它线程没法在这个区域分配而已。当一个 TLAB 用满(分 配指针 top 撞上分配极限 end 了),就新申请一个 TLAB。url


评论.net

相关文章
相关标签/搜索