G1技术细节之记忆集和卡表解决跨代引用问题
跨代引用面临的问题
首先,产生跨代引用场景是发生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技术细节之记忆集和卡表解决跨代引用问题相关推荐
- JVM之记忆集和卡表
当我们进行young gc时,我们的gc roots除了常见的栈引用.静态变量.常量.锁对象.class对象这些常见的之外,如果老年代有对象引用了我们的新生代对象,那么老年代的对象也应该加入gc ro ...
- JVM垃圾回收-记忆集和卡表
- Hotspot细节实现安全区域、记忆集卡表
Hotspot细节实现 文章目录 Hotspot细节实现 3.安全区域 产生原因 安全区域概念 实现过程 4.记忆集与卡表 产生原因: 记忆集概念 实现过程: 卡精度(卡表) 3.安全区域 产生原因 ...
- JVM之记忆集|卡表|写屏障
背景 分代收集理论的时候,会存在为了解决对象跨代引用所带来的的问题.垃圾收集器在新生代中建立了名为记忆集的数据结构,用来避免把整个老年代加进GC roots扫描范围.事 实上并不只是新生代.老年代之间 ...
- 跨代引用、记忆集、卡表
一.什么是跨代引用? 新生代中的对象持有了老年代中的对象的引用 或 老年代中的对象持有了新生代中对象的引用. 如下图所示,新生代中的A对象持有了老年代中C对象的引用:老年代中的C对象持有了新生代中B对 ...
- 记忆集(Remember Set)和卡表(Card Table)
记忆集和卡表 为了解决对象跨代引用所带来的问题,垃圾收集器在新生代中建立了名为记忆集(Remembered Set)的数据结构,用以避免把整个老年代加进GC Roots扫描范围.事实上并不是只是新生代 ...
- 面试篇之JVM(GC 可达性分析 回收算法 卡表 G1)
面试篇之JVM 面试篇之JVM GC 对象存活判断 分代回收理论 常见回收算法 HotSpot实现细节 记忆集与卡表 读写屏障 回收器 并发标记 G1 面试篇之JVM GC 美团 1.JVM怎么判断一 ...
- JVM---G1中的RSet和卡表
关于跨代引用和YGC什么的我就解释了,如果描述清楚的话,又要写一大篇,况且网上关于这些概念的解释有很多,我这里只说一下几个我理解错和理解好长时间的地方. 参考文章 <JVM(十二)记忆集和卡表& ...
- G1实现原理之记忆集与卡表
这几天花时间完成了标记-清除算法.标记-整理算法.标记-复制算法,还算顺利.今天准备动手写G1,整理思路过程中发现G1涉及到的概念相当多而且还难以理解,网上的文章.相关书籍对相关概念的解释相对比较孤立 ...
最新文章
- solaris下ftp配置说明
- python【Matlibplot绘图库】-主要概念
- php目录间拷贝文件方法
- 全球及中国防褥疮充气垫行业投资前景展望与“十四五”发展规划建议报告2021年版
- 收集Redis 经典面试题
- 【模板】最大权闭合图
- C语言游戏传递小秘密,C语言的那些小秘密之链表
- svg defs 进行定义 引用
- pagex,screenx,clientx的差别
- c语言游戏源码_【C语言/C++】益智游戏开发:2048(思路+源码详解)
- 动规 - 最大子矩阵问题
- js 字符串截取数组常用方法总结(前端)
- 利用Cadence软件中的Model Editor工具和元器件的模型文本文件创建Spice模型
- Aura Component父子组件通信
- 【树莓派】树莓派TXD、RXD的配置与使用可实现与STM32的通信
- 京东市值增近500亿,刘强东却接二连三卸任,这下的是什么棋?
- 德州扑克分池算法 思路及lua实现
- vacuum命令详解
- 三星s10android10功能,三星s10+有nfc功能吗 三星s10+支持NFC吗
- AMD 7nm服务器处理器带来的市场破局
热门文章
- 【夏虫语冰】Win10局域网下两台电脑无法ping通: 无法访问目标主机
- c语言读写nfc,NFC标识最新资讯
- 线性规划求解器 matlab,基于求解器设置线性规划
- ffmpeg+mencoder的视频格式转换
- (附源码)计算机毕业设计SSM综合售楼系统
- 青海大学计算机考研调剂,青海大学2021年硕士研究生招生调剂公告
- 计蒜客 封印之门(最短路,floyd)
- 【JZOJ5411】【NOIP2017提高A组集训10.22】友谊
- 安装Mysql-8.0.11遇到的问题
- 2019最新妙味课堂Javascript实炼高级专题项目实战(完整)