JVM——OopMap And RememberSet (HotSpot 中的OopMap数据结构 与 GC 垃圾回收 避免重复扫描的优化 记忆集)

📖 JVM 之 OopMap 和 RememberSet

🔖 OopMap

OopMap 有什么用?

OopMap 用于枚举GCRoots

  • 当垃圾回收发生时,收集线程对栈上的内存进行扫描,看看哪些位置上存储了 Reference 类型,就意味着这个引用所指向的对象在这一次垃圾回收过程中不能进行回收。

当然问题就出现了~

  • 栈上的本地变量表里面只有一部分数据是 Reference 类型的 ,为了避免每次垃圾回收时都要扫描整个栈,所以采用了 空间换时间 的策略在某个(安全点)把栈上代表引用的位置记录下来,GC时直接读取,以防全部扫描。

  • HotSpot 虚拟机采用了一种叫做 OopMap 的数据结构用于记录上述引用(OopMap也帮助了HotSpot实现了准确GC),OopMap记录了栈上本地变量到堆上对象的引用关系,这些引用关系对象不能够回收,并且可以作为根节点来进行可达性分析,查找出不能够回收的对象

  • 一个线程意味着一个栈,一个栈由多个栈帧组成,一个栈帧对应着一个方法,一个方法中可能有多个安全点,GC 发生时,程序首先运行到最近的一个安全点停下来,STW 并且更新自己的 OopMap记录栈上哪些位置代表引用,枚举根节点时,递归遍历每个栈帧的OopMap,通过栈中记录的被引用的对象内存地址,即可找到这些对象(GC Roots),所以说一个方法可能有多个OopMap,每一个记录的也只仅限于自己的那一段代码。

🔖 RememberSet

RememberSet 是什么?

  • 每个region都有一个记忆集(Rset)记忆集记录下当前这个region中的对象被哪些对象所引用。例如,region2 中的两个对象分别被region1中的对象和region3中的对象所引用,那么,region2的记忆集记录的就是region1和region3中的引用region2的对象的引用

  • 这样一来在回收region2的时候就不用扫描全部的region了只需要访问记忆集,就知道当前region2里面的对象被哪些对象所引用,判断其是不是存活对象。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alascanfu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值