当前位置: 首页 > 知识库问答 >
问题:

G1算法中的记忆集用于什么?

翟博雅
2023-03-14

我刚刚读了一些关于G1算法的博客。

我对记忆集的用法感到困惑。

以下是我的想法:

既然我们可以使用DFS遍历来自GC根的每个引用,为什么我们需要记住集合?

因为所有的博客都说我们使用的原因是,我们不需要检查每个区域,看看是否有一个对象被GC-Roots引用

共有1个答案

艾飞宇
2023-03-14

首先,您需要理解什么是Card Table,IMO。如果有从旧代返回到年轻的引用,您如何只扫描年轻代区域并清理它?您需要准确地“跟踪”这些连接的位置——因此,在扫描年轻代时,您可以在不破坏堆的情况下清理它。

想一想:如果有一个B的参考,你就不能把一个对象A标记为现在是年轻一代的对象,从老一代的中删除它。但请记住,现在,你只是在年轻的收集。因此,为了跟踪这些“连接”,实现了一个卡表。这个卡片表中的每一位都表示老一代的某一部分是“脏的”,这意味着在扫描年轻一代的同时也扫描老一代的那一部分。

为什么你需要这个?扫描年轻的全部目的是扫描堆中的一小部分,而不是全部。这个<代码>卡片表实现了这一点。

G1有区域。如果您正在扫描区域A,并且您看到它有指向其他区域B的指针,该怎么办?简单地将这些信息放在卡表中是不够的。您的卡表将只知道区域A,并且下次您扫描区域B时-您怎么知道您应该也扫描区域A?如果您不这样做,显然堆完整性被破坏了。

因此:记忆集。这些集合由异步线程填充:它扫描卡表,并根据该信息扫描这些“脏”区域的指针指向的位置。它跟踪那地区-

因此,当你到达需要进行GC的点时,当扫描区域B时,你也会查看它的记忆集,发现你也需要扫描区域A

在实践中,这就是为什么G1成为一代:这些记住的集合被证明是巨大的。如果你把堆分成年轻的和老的,就没有必要保留年轻代之间的连接,你一次就把它们全部扫描了,这样就把烧毁的这些集合的大小带走了。G1想要保持200ms(默认)的promise-要做到这一点,你需要一次扫描年轻代(因为在记住的集合中的区域之间没有连接,否则堆的完整性就消失了),但同时如果你把年轻代变小-记住的集合的大小就会变大。

因此,触摸这些设置是一个工程奇迹,IMHO。

 类似资料:
  • 我一直在研究一个基本的子集和问题。给定一个和,比如说6,和数字[1,2,3,4,5,6]),我必须找到总的组合数s(对于s=6:[1,5],[2,4],[1,2,3])。 我已经能够用蛮力解决这个问题,但还没有找到记忆它的方法,所以我的代码对于足够大的n值是不可行的。 我在这里找到了一个非常有效的记忆算法,但是它只给我组合的数量(所以,对于s=6,组合的数量将是3)——而不是组合本身。是否有可能既

  • 我们正在使用Firebase Firestore进行数据存储。当用户创建一个新房间时,我们希望引用易于记忆,这样一个用户就可以与其他用户共享房间ID/代码。 目前Firestore将创建一个唯一的引用,如:DvfTMYED5cWdo5qIraZg 这太长了,很难记住或分享。我们可以手动设置不同的引用,但它们必须是唯一的。另一点是,用户可以创建多个房间,因此每次都必须更改引用。 有没有办法为这个用例

  • 我想创建一个程序来模拟Unix服务器上的内存不足(OOM)情况。我创造了这个超级简单的记忆食客: 它消耗的内存与中定义的一样多,现在正好是50 问题是它是有效的。即使在具有1的系统上 当我检查top时,我看到这个过程消耗了50 系统规范:Linux内核3.16(Debian)很可能启用了Overmit(不知道如何检查),没有交换和虚拟化。

  • 问题内容: 我想创建一个程序来模拟Unix服务器上的内存不足(OOM)情况。我创建了这个超级简单的内存消耗者: 它消耗的内存与定义的内存一样多,而现在恰好是50 GB的RAM。它按1 MB分配内存,并精确打印无法分配更多内存的点,这样我就知道它设法吃了哪个最大值。 问题是它有效。即使在具有1 GB物理内存的系统上。 当我检查顶部时,我发现该进程占用了50 GB的虚拟内存,而占用的驻留内存不到1 M

  • 我的想法是有一个这样的东西,您可以在其中存储以前的答案并在以后查找它们。我想这可以通过lambda表达式来完成,但我不太熟悉它们。我不太确定如何编写这个方法,希望得到一些帮助。 用这种方法能做到这一点吗?

  • 首先大家要知道,记忆化搜索是动态规划的入门。 什么是记忆化搜索?搜索的低效在于没有能够很好地处理重叠子问题;动态规划虽然比较好地处理了重叠子问题,但是在有些拓扑关系比较复杂的题目面前,又显得无奈。记忆化搜索正是在这样的情况下产生的,它采用搜索的形式和动态规划中递推的思想将这两种方法有机地综合在一起,扬长避短,简单实用,在信息学中有着重要的作用。 用一个公式简单地说:记忆化搜索=搜索的形式+动态规划