跨代引用面临的问题

首先,产生跨代引用场景是发生YongGC的过程。此时新生代的对象会开始寻找根,看自己是否属于根可达对象,从而判断自己是否是垃圾。

那很多同学就开始有疑惑了?不是判断对象是否存活,应该是从GC Roots开始寻找,使用复杂的三色标记算法后,将判定不存活的对象删除掉么?

但我们知道,并不是所有老年代的对象都会引用着新生代的对象。那么相对频繁的YongGC,每次都从根节点遍历一次,效率就会被严重影响。

因此,就引入了卡表和记忆集的概念。卡表将整个老年代分成了多个层级,card[0],card[1],card[2]......。如果某个card区域中的老年代对象引用着新生代的对象,那么就被叫做脏卡。当YongGC发生时,某个新生代的对象发现其GCRoots发现在老年代,并进行跨代寻找的时候,只需要在对这些脏卡中的GCRoots,使用可达性分析算法,判断是否存活即可。加速了垃圾回收的速度与回收成本。

那么具体是如何执行的呢?我们接着看。

GCRoots在新生代

假设现在整个堆空间只有两个对象。此时两个对象都在新生代。此时GC线程是非常容易判断这两个对象被GCRoots引用,属于存活对象。

随着程序的长时间运行。此时出现了以下情况:

GCRoots移动到老年代

可以看到,老年代的对象HumongN被GCRoots所引用,此时HumongN->S就是跨代引用。S又引用着E,因此这三个对象都不是垃圾。

我们说在新生代中,由E找到S是非常快速简单的。然而由S找到HumongN就需要遍历整个老年代的对象,这个过程是相当耗时的。所以要避免每次 YGC 时扫描整个老年代,减少开销。

解决跨代引用流程

在判断新生代对象是否根可达时,一部分对象是朝生夕死的对象,而另一部分可能是有由相当老年代的对象引用而来的。而一般老年代的引用关系都相当复杂,为了节约扫描时间成本,我们在每个新生代对象中存入一个RSet记录卡表。在检索新生代引用即将跨代时,会根据卡表的Key,Value快速定位到正确的老年代引用,以达到减少开销的目的。

RSet(记忆集)

记录了其它Region中的对象到Region的引用。

RSet的价值在于使得垃圾回收不需要扫描整个堆,能够快速定位到真正引用它的堆对象地址。ReSet本身就是一个Hash表,存储在新生代的每个Region中。但是存储需要消耗空间,多的能达到百分之20。因此G1对内存的空间要求较高(小空间没资本玩),空间越大性能越彪悍。

CardTable

由于新生代GC时,需要扫描整个old区,效率非常低。所以old区就是用卡表的方式进行一次逻辑分区。一般一页卡表的大小是2的n次幂。每一个区域也是用Key,Value结构进行记录。每一区域记录为Key不重复,Value则记录这片区域的老年代对象与新生代对象是否存在引用关系,存在则标记为1,否则为0。记录完毕后把value为1的key作为ReSet的key进行记录,并且ReSet的value存储引用,从而提高跨代引用的查询效率。

总结

G1的设计因为这些记录,划分Region的原因,对基础内存的要求比较高。CMS也存在ReSet与CardTabe。但是因为CMS没有Region的存在,新生代只有一份,所以只需要记录一份,对空间要求不高。所以虽然G1优点很多,但是不推荐堆空间小于6G以下使用G1。

G1技术细节之记忆集和卡表解决跨代引用问题相关推荐

  1. JVM之记忆集和卡表

    当我们进行young gc时,我们的gc roots除了常见的栈引用.静态变量.常量.锁对象.class对象这些常见的之外,如果老年代有对象引用了我们的新生代对象,那么老年代的对象也应该加入gc ro ...

  2. JVM垃圾回收-记忆集和卡表

  3. Hotspot细节实现安全区域、记忆集卡表

    Hotspot细节实现 文章目录 Hotspot细节实现 3.安全区域 产生原因 安全区域概念 实现过程 4.记忆集与卡表 产生原因: 记忆集概念 实现过程: 卡精度(卡表) 3.安全区域 产生原因 ...

  4. JVM之记忆集|卡表|写屏障

    背景 分代收集理论的时候,会存在为了解决对象跨代引用所带来的的问题.垃圾收集器在新生代中建立了名为记忆集的数据结构,用来避免把整个老年代加进GC roots扫描范围.事 实上并不只是新生代.老年代之间 ...

  5. 跨代引用、记忆集、卡表

    一.什么是跨代引用? 新生代中的对象持有了老年代中的对象的引用 或 老年代中的对象持有了新生代中对象的引用. 如下图所示,新生代中的A对象持有了老年代中C对象的引用:老年代中的C对象持有了新生代中B对 ...

  6. 记忆集(Remember Set)和卡表(Card Table)

    记忆集和卡表 为了解决对象跨代引用所带来的问题,垃圾收集器在新生代中建立了名为记忆集(Remembered Set)的数据结构,用以避免把整个老年代加进GC Roots扫描范围.事实上并不是只是新生代 ...

  7. 面试篇之JVM(GC 可达性分析 回收算法 卡表 G1)

    面试篇之JVM 面试篇之JVM GC 对象存活判断 分代回收理论 常见回收算法 HotSpot实现细节 记忆集与卡表 读写屏障 回收器 并发标记 G1 面试篇之JVM GC 美团 1.JVM怎么判断一 ...

  8. JVM---G1中的RSet和卡表

    关于跨代引用和YGC什么的我就解释了,如果描述清楚的话,又要写一大篇,况且网上关于这些概念的解释有很多,我这里只说一下几个我理解错和理解好长时间的地方. 参考文章 <JVM(十二)记忆集和卡表& ...

  9. G1实现原理之记忆集与卡表

    这几天花时间完成了标记-清除算法.标记-整理算法.标记-复制算法,还算顺利.今天准备动手写G1,整理思路过程中发现G1涉及到的概念相当多而且还难以理解,网上的文章.相关书籍对相关概念的解释相对比较孤立 ...

最新文章

  1. solaris下ftp配置说明
  2. python【Matlibplot绘图库】-主要概念
  3. php目录间拷贝文件方法
  4. 全球及中国防褥疮充气垫行业投资前景展望与“十四五”发展规划建议报告2021年版
  5. 收集Redis 经典面试题
  6. 【模板】最大权闭合图
  7. C语言游戏传递小秘密,C语言的那些小秘密之链表
  8. svg defs 进行定义 引用
  9. pagex,screenx,clientx的差别
  10. c语言游戏源码_【C语言/C++】益智游戏开发:2048(思路+源码详解)
  11. 动规 - 最大子矩阵问题
  12. js 字符串截取数组常用方法总结(前端)
  13. 利用Cadence软件中的Model Editor工具和元器件的模型文本文件创建Spice模型
  14. Aura Component父子组件通信
  15. 【树莓派】树莓派TXD、RXD的配置与使用可实现与STM32的通信
  16. 京东市值增近500亿,刘强东却接二连三卸任,这下的是什么棋?
  17. 德州扑克分池算法 思路及lua实现
  18. vacuum命令详解
  19. 三星s10android10功能,三星s10+有nfc功能吗 三星s10+支持NFC吗
  20. AMD 7nm服务器处理器带来的市场破局

热门文章

  1. 【夏虫语冰】Win10局域网下两台电脑无法ping通: 无法访问目标主机
  2. c语言读写nfc,NFC标识最新资讯
  3. 线性规划求解器 matlab,基于求解器设置线性规划
  4. ffmpeg+mencoder的视频格式转换
  5. (附源码)计算机毕业设计SSM综合售楼系统
  6. 青海大学计算机考研调剂,青海大学2021年硕士研究生招生调剂公告
  7. 计蒜客 封印之门(最短路,floyd)
  8. 【JZOJ5411】【NOIP2017提高A组集训10.22】友谊
  9. 安装Mysql-8.0.11遇到的问题
  10. 2019最新妙味课堂Javascript实炼高级专题项目实战(完整)