引言:在JVM中,使用到了记忆集这种数据结构来解决跨代引用的问题,使得仅花费很小的代价就知道了哪些老年代区域上的对象包含了指向新生代的指针,从而避免了扫描整个老年代。但是现在有一个问题,由于在运行的过程中,引用关系可能随时发生改变,那么怎么样让虚拟机即使知道这种变化,并且记录下来呢?写屏障技术就闪亮登场了!
什么是写屏障技术?
大家都知道,在Spring框架中,采用了AOP来增强Bean实例的方法,写屏障技术和AOP技术类似,AOP技术在方法的前后增加特定的环节来增强目标方法的功能,写屏障技术在写操作的前后增加特定的环节来增强写操作(即赋值操作)的功能。
也就是说,当有引用发生改变(即写操作的时候),虚拟机就会在写操作的前后插入一个C++层面的方法,这个方法把这种引用关系记录下来,并且更新到卡表。
接下来,我们举一个例子来说明这个过程,先给出整体的流程图
(1)当引用关系发生变化
橙色箭头表示引用关系发生变化,新增了一个老年代到新生代的引用。
(2)写后屏障记录下这种变化并更新卡表
这样,每次引用关系变化(即写操作或赋值操作),JVM都能感知这种变化,并且记录到卡表里,这样就保证每次GC的时候,卡表的内容是最新的。
结语
(1)上文提到的记忆集指的是经典收集器的记忆集
(2)维护经典收集器的记忆集没用到写前屏障,写前屏障在原始快照技术中得到了应用。
(3)下一篇文章将讲述G1收集器中的记忆集,它与经典收集器中的记忆集存在较大不同