Overview

G1的每个region都有一个Remember Set(Rset)
这个数据结构,用来保存别的region的对象对我这个region的对象的引用,通过Remember Set我们可以找到哪些对象引用了当前region的对象

参考这个文章

由于对我当前region对象的引用可能很多,也可能很少,G1会根据数量的变化来改变数据结构以达到节省空间的目的

第1种,哈希表

key是region的index,value是card数组。
card数组是个啥?

第2种,细粒度的PerRegionTable

这是一个Heap位图,每一位对应一个card
card又是个啥?

第3中,粗粒度位图

每一位代表对应的分区有引用到当前region,具体的对象还得在对应的分区里找

看代码吧那就

看的是jdk12源码

先看定义了哪些结构

src/hotspot/share/gc/g1/heapRegionRemSet.hpp

头部注释,介绍了Remember set

// Remembered set for a heap region.  Represent a set of "cards" that
// contain pointers into the owner heap region.  Cards are defined somewhat
// abstractly, in terms of what the "BlockOffsetTable" in use can parse.

就是一个set,记录了哪些card包含了指向我们当前region的指针。这个card是抽象的,BlockOffsetTable可以解析这个玩意儿?

再来一大段注释

// The "_coarse_map" is a bitmap with one bit for each region, where set
// bits indicate that the corresponding region may contain some pointer
// into the owning region.// The "_fine_grain_entries" array is an open hash table of PerRegionTables
// (PRTs), indicating regions for which we're keeping the RS as a set of
// cards.  The strategy is to cap the size of the fine-grain table,
// deleting an entry and setting the corresponding coarse-grained bit when
// we would overflow this cap.// We use a mixture of locking and lock-free techniques here.  We allow
// threads to locate PRTs without locking, but threads attempting to alter
// a bucket list obtain a lock.  This means that any failing attempt to
// find a PRT must be retried with the lock.  It might seem dangerous that
// a read can find a PRT that is concurrently deleted.  This is all right,
// because:
//
//   1) We only actually free PRT's at safe points (though we reuse them at
//      other times).
//   2) We find PRT's in an attempt to add entries.  If a PRT is deleted,
//      it's _coarse_map bit is set, so the that we were attempting to add
//      is represented.  If a deleted PRT is re-used, a thread adding a bit,
//      thinking the PRT is for a different region, does no harm.

_coarse_map:粗粒度位图。是一个位图,每一位指向一个region,某一位设置为1代表有指针指向当前region。

_fine_grain_entries:细颗粒入口。哈希表,元素是PerRegionTables(PRTs),我们保存了RS(一个card的set),指向一些regions。策略是根据细粒度表的大小初始化一下,当我们容量超限的时候,删除entry并设置相应的粗粒度的bit。

我们混合使用 加锁机制 和 不加锁机制 。允许线程不加锁读PRTs,但是要修改bucket的话必须获得锁。这意味着任何查找PRT需要用重试获得锁。看起来,读操作可以找到一个并行的时候被删除的PRT是很危险的。但其实没啥问题,因为
1)我们实际上只在安全的时候释放PRT’s ???
2)我们找PRT’s是为了加entries。如果一个PRT被删除了,他相应的_coarse_map的位设置为1,所以我们尝试去加的那个就呈现了。如果删除的PRT被重用,一个线程加了一个bit,认为PRT是给另一个region的,也没有问题

强行翻译,是在看不懂

理解G1 Remember Set(RSet)相关推荐

  1. G1垃圾收集器之RSet

    本文来说下G1垃圾收集器之RSet 文章目录 堆内存 Region RSet RSet实现过程 RSet有什么好处 RSet有什么风险 本文小结 堆内存 在G1的垃圾回收算法中,堆内存采用了另外一种完 ...

  2. 5张图带你彻底理解G1垃圾收集器

    作为一款高效的垃圾收集器,G1在JDK7中加入JVM,在JDK9中取代CMS成为了默认的垃圾收集器. 1 垃圾收集器回顾 1.1 新生代 新生代采用复制算法,主要的垃圾收集器有三个,Serial.Pa ...

  3. [转]深入理解G1垃圾收集器

    G1 GC是Jdk7的新特性之一.Jdk7+版本都可以自主配置G1作为JVM GC选项:作为JVM GC算法的一次重大升级.DK7u后G1已相对稳定.且未来计划替代CMS.所以有必要深入了解下: 不同 ...

  4. 转:深入理解Java G1垃圾收集器

    本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...

  5. 深入理解 Java G1 垃圾收集器--转

    原文地址:http://blog.jobbole.com/109170/?utm_source=hao.jobbole.com&utm_medium=relatedArticle 本文首先简单 ...

  6. 深入理解 Java G1 垃圾收集器

    本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...

  7. 深入理解 Java G1 垃圾收集器GC调优

    本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...

  8. java -g_Java G1深入理解(转)

    一.什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么?简单的说垃圾回收就是回收内存中不再使用的对象. 垃圾回收的基本步骤有2步:1.查找内存中不再使用的对象:2.释放这些对象占 ...

  9. java -g_【JVM】7、深入理解Java G1垃圾收集器

    本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...

最新文章

  1. C++中虚函数可以是内联函数吗?
  2. 牛津大学计算机系主任:人工智能立法重在抓机遇、防危害
  3. 启用日志调试Kerberos登录验证问题
  4. unity_简单五子棋的实现(无AI)
  5. 美团配送资金安全治理之对账体系建设
  6. 虚拟化技术的概述及使用
  7. 闲鱼商品理解和选品,究竟是怎么做的?
  8. 编写高效的PyTorch代码技巧(上)
  9. 二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...
  10. 分公司部署加速设备实现广域网加速
  11. 双11数据过于完美涉嫌造假?天猫:造谣要负法律责任的哦
  12. 离散数学:构造性二难推理和破坏性二难定理的解释
  13. Maven下载安装配置详细过程
  14. java双重循环去重_java 中 list集合去重
  15. c++的vector初始化
  16. Matlab求方差,均值
  17. 演示固态硬盘装win11系统教程
  18. C# WinForm GUI之示例
  19. Photoshop —— 白色(或任意颜色)或黑色物体修改成任意色彩
  20. uniapp跨域设置

热门文章

  1. HTML标题与段落:网络文章网页
  2. 传奇自定义技能栏技术分享-GEE
  3. 电商平台-商品表的设计
  4. jQuery 稳定、快速的CDN加速服务引用地址
  5. xargs -0 是什么意思
  6. The server quit without updating PID file解决方法
  7. 如何减小Ubuntu 16.04系统下VMware虚拟机硬盘空间占用过大问题
  8. equal 和 ==
  9. PYTHON脚本将excl表格中的科学计数法转变为普通数值
  10. Java如何定义三维数组