漏标-读写屏障
写屏障
void oop_field_store(oop* field, oop new_value) { <br> pre_write_barrier(field); // 写屏障-写前操作<br> *field = new_value; <br> post_write_barrier(field, value); // 写屏障-写后操作<br>}
读屏障
oop oop_field_load(oop* field) {<br> pre_load_barrier(field); // 读屏障-读取前操作<br> return *field;<br>}
增量更新Incremental Update
当对象A的成员变量的引用发生变化时,比如新增引用(a.d = d),<br>我们可以利用写屏障,将A新的成员变量引用对象D记录下来<br>void post_write_barrier(oop* field, oop new_value) { <br> remark_set.add(new_value); // 记录新引用的对象<br>}<br>
原始快照Snapshot At The Beginning,SATB
当对象B的成员变量的引用发生变化时,比如引用消失(a.b.d = null),<br>我们可以利用写屏障,将B原来成员变量的引用对象D记录下来:<br>void pre_write_barrier(oop* field) {<br> oop old_value = *field; // 获取旧值<br> remark_set.add(old_value); // 记录原来的引用对象<br>}