探究JVM(四)利用写屏障技术来维护记忆集

引言:在JVM中,使用到了记忆集这种数据结构来解决跨代引用的问题,使得仅花费很小的代价就知道了哪些老年代区域上的对象包含了指向新生代的指针,从而避免了扫描整个老年代。但是现在有一个问题,由于在运行的过程中,引用关系可能随时发生改变,那么怎么样让虚拟机即使知道这种变化,并且记录下来呢?写屏障技术就闪亮登场了!

什么是写屏障技术?

大家都知道,在Spring框架中,采用了AOP来增强Bean实例的方法,写屏障技术和AOP技术类似,AOP技术在方法的前后增加特定的环节来增强目标方法的功能,写屏障技术在写操作的前后增加特定的环节来增强写操作(即赋值操作)的功能。
也就是说,当有引用发生改变(即写操作的时候),虚拟机就会在写操作的前后插入一个C++层面的方法,这个方法把这种引用关系记录下来,并且更新到卡表。
接下来,我们举一个例子来说明这个过程,先给出整体的流程图

(1)当引用关系发生变化

橙色箭头表示引用关系发生变化,新增了一个老年代到新生代的引用。

(2)写后屏障记录下这种变化并更新卡表

这样,每次引用关系变化(即写操作或赋值操作),JVM都能感知这种变化,并且记录到卡表里,这样就保证每次GC的时候,卡表的内容是最新的。

结语

(1)上文提到的记忆集指的是经典收集器的记忆集
(2)维护经典收集器的记忆集没用到写前屏障,写前屏障在原始快照技术中得到了应用。
(3)下一篇文章将讲述G1收集器中的记忆集,它与经典收集器中的记忆集存在较大不同

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值