<Load barrier start>
if (n & bad_bit_mask) {
slow_path(register_for(n), address_of(person.name));
}
<Load barrier end>
String p = n ; // 无需屏障,不是从堆中读取引用
n.isEmpty() ; // 无需屏障,不是从堆中读取引用
int age = person.age; // 无需屏障,不是对象引用在读屏障示例中,JVM 注入了如下的一段读屏障代码:
if (n & bad_bit_mask) {
slow_path(register_for(n), address_of(person.name));
}对应的字节码如下:
mov 0x10(%rax), %rbx // String n = person.name;
test %rbx, 0x20(%r15) // Bad color?
jnz slow_path // Yes -> Enter slow path and
// mark/relocate/remap, adjust
// 0x10(%rax) and %rbx假如 person 对象发生移动,因此 n 和 person.name 的地址都会发生变化,当使用 n 前,需要判断 n 的染色指针是否为 good,如果为 bad color,可以得知 n 的引用地址被修改过,因此需要修正 n 和 person.name的地址,整个过程如下图: