首页
学习
活动
专区
工具
TVP
发布

RSet(Remembered Set)

RSet(Remembered Set)是一个空间换时间的数据结构(已记忆集合)新生代回收的跨代引用(老年代引用新生代)问题:新生代的根对象,一部分来自于老年代老年代再进行细分:card-table脏卡...RSet是个哈希表,key记录了对象所在Region,Value记录了对象所在Card(这里的Card 和 Card Table里面的Card一模一样),具体如下图:借助RSet如何知道A对象是否被引用...:1、首先检查当前RSet是否有数据,如果RSet为空,表示当前Region里的所有对象没有被其他Region对象引用过,2、那么只需要利用可达性分析算法扫描当前区域,就可以知道A有没有被引用; 3、如果...RSet不为空,则只需要扫描当前Region,和RSet里面的Region 下的某个Card区域。...显而易见,RSet 和 Card Table 具有类似的功能,就是避免在标记垃圾时进行全堆扫描操作。

4800
您找到你想要的搜索结果了吗?
是的
没有找到

G1垃圾收集器详解(4)之RSet

RememberedSet RememberedSet(简称RS或RSet)就是用来解决这个问题的,RSet会记录这种跨代引用的关系。...在进行标记时,除了从GC ROOTS开始遍历,还会从RSet遍历,确保标记该区域所有存活的对象(其实不光是G1,其他的分代回收器里也有,比如CMS) 如下图所示,G1中利用一个RSet来记录这个跨区域引用的关系...,每个区域都有一个RSet,用来记录这个跨区引用,这样在进行标记的时候,将RSet也作为ROOTS进行遍历即可 ?...所以在对象晋升的时候,将晋升对象记录下来,这个存储跨区引用关系的容器称之为RSet,在G1中通过Card Table来实现。...注意,这里说Card Table实现RSet,并不是说Card Table是RSet背后的数据结构,只是RSet中存储的是Card Table数据 ?

1.5K11

使用动态SQL(五)

别名属性名称:如果定义了字段别名,则将别名属性名称指定为rset.AliasProp。别名属性名称是根据SELECT语句中的列名称别名生成的。不能为具有已定义别名的字段指定字段属性名称。...别名:如果定义了字段别名,则将此别名(或别名属性名称)指定为rset。“ alias”。这是SELECT语句中的列名别名。您不能为具有已定义别名的字段指定字段名称。...例如,对于SELECT Notes AS%Message,调用rset。%Message将不返回Notes字段值。它返回为语句结果类定义的%Message属性。可以使用rset。...例如,对于SELECT Name AS Last_Name,只能使用rset.LastName或rset。“ Last_Name”来检索数据,而不能使用rset.Name。...如果SELECT语句包含相同字段名称或字段名称别名的多个实例,则rset.propname或rset。“fieldname”始终返回SELECT语句中指定的第一个。

87640

详解 JVM Garbage First(G1) 垃圾收集器

栅栏是指在原生代码片段中,当某些语句被执行时,栅栏代码也会被执行。而G1主要在赋值语句中,使用写前栅栏(Pre-Write Barrrier)和写后栅栏(Post-Write Barrrier)。...写前栅栏 Pre-Write Barrrier 即将执行一段赋值语句时,等式左侧对象将修改引用到另一个对象,那么等式左侧对象原先引用的对象所在分区将因此丧失一个引用,那么JVM就需要在赋值语句生效之前,...写后栅栏 Post-Write Barrrier 当执行一段赋值语句后,等式右侧对象获取了左侧对象的引用,那么等式右侧对象所在分区的RSet也应该得到更新。...当赋值语句发生时,应用将会改变了它的对象图,那么JVM需要记录被覆盖的对象。因此写前栅栏会在引用变更前,将值记录在SATB日志或缓冲区中。每个线程都会独占一个SATB缓冲区,初始有256条记录空间。...当赋值语句发生后,写后栅栏会先通过G1的过滤技术判断是否是跨分区的引用更新,并将跨分区更新对象的卡片加入缓冲区序列,即更新日志缓冲区或脏卡片队列。

14.5K57

if语句与while语句

一、条件分支结构:if语句 • 让计算机能够自动根据当前的状况来决定执行哪些语句 • 条件分支结构的2个要素:判断条件、一组语句 • if语句首先计算判断条件:如果得到True,就执行这组语句,否则,不执行开大...二、if语句的附加要素:elif和else • if语句可以附加两个子句 • else子句可以指定在判断条件不成立的时候,要执行的一组语句 • elif子句可以在判断条件不成立的时候,再继续判断另一个条件...五、break语句 • 有时候需要立刻中断循环 • break语句立刻中断退出循环:如果有多个循环嵌套,仅退出直接包含它的那一层循环 • 可以用在for和while循环语句中 • 我们试着用for +...六、continue语句 • 有时候在执行循环体语句的时候,需要忽略余下的语句,直接跳到下一次循环 • continue语句立刻跳到下一次循环:仅作用于直接包含它的循环语句 • 可以用在for和while...语句 ?

1.7K10

详解 JVM Garbage First(G1) 垃圾收集器

栅栏是指在原生代码片段中,当某些语句被执行时,栅栏代码也会被执行。而G1主要在赋值语句中,使用写前栅栏(Pre-Write Barrrier)和写后栅栏(Post-Write Barrrier)。...写前栅栏 Pre-Write Barrrier 即将执行一段赋值语句时,等式左侧对象将修改引用到另一个对象,那么等式左侧对象原先引用的对象所在分区将因此丧失一个引用,那么JVM就需要在赋值语句生效之前,...写后栅栏 Post-Write Barrrier 当执行一段赋值语句后,等式右侧对象获取了左侧对象的引用,那么等式右侧对象所在分区的RSet也应该得到更新。...当赋值语句发生时,应用将会改变了它的对象图,那么JVM需要记录被覆盖的对象。因此写前栅栏会在引用变更前,将值记录在SATB日志或缓冲区中。每个线程都会独占一个SATB缓冲区,初始有256条记录空间。...当赋值语句发生后,写后栅栏会先通过G1的过滤技术判断是否是跨分区的引用更新,并将跨分区更新对象的卡片加入缓冲区序列,即更新日志缓冲区或脏卡片队列。

63710

If语句

每种编程语言都会有自己规则的语句,大多都大同小异,今天学习这种最普通的If语句。 前面我们说过,想快速查看帮助文件,可以用鼠标定位到关键字的单词内部,按F1。...A1-A5有一些数字,我们通过If语句来判断他的奇偶,举了3种写法的例子。...一种是赋值 一种是判断是否相等,是一种比较,会返回true或者false的Boolean值 If后面返回true,就是执行Then后面的语句,否则就会执行Else后面的语句,如果没有Else就不会执行...这种通过简单的语句的嵌套,可以构建出非常复杂的逻辑关系,只要你的头脑能够理清楚,而电脑适合做的就是这种严格执行语句,无论是多少无聊枯燥的、还是多么烧脑的逻辑,对电脑来说都一样。...小结 If语句是编程语言非常基础、也是非常必要的一种(好像没有什么语言没有这个吧),写程序会大量使用到这个,而且这个用起来应该来说还是比较简单的。

1.1K10
领券