是否有任何考虑分页的垃圾收集器?


12

垃圾回收必须访问所有存在的对象,以便找到可以回收的内存。(有很多世代只是延迟了一下)

在所有条件都相同的情况下,最好先访问已分页到RAM中的对象,然后再分页其他块并分页出某些对象。

另一种可能是,当OS希望从进程中删除一整页的内存时,首先会询问GC是否具有可以放弃而无需分页的页面。GC通常可以通过从页面移动对象来完成,因此可以在OS需要页面的限期内清除该页面。

但是,我想不起任何与OS分页系统集成的垃圾收集器,这些垃圾收集器会驱动GC的工作顺序。


不完全是分页,而是重写了ruby企业版 gc,以通过将对象元数据移动到单独的页面上来减少gc对写页面上的副本的影响。
user1937198 2014年


令人惊讶的是,afaik / afaict,几乎所有(?)gc文献似乎都没有抽象地分析OS分页。想法:在一个与对象本身分离的结构中,跟踪对象之间的指针的内存分配系统可能对本地/分页更友好,因为只有指针本身(在gc期间)在紧密压缩的空间中遍历,而不是所有对象可能分散在内存中的各种大小(以及一些不经常访问的页面)。可能会有一些适度的开销,但是根据实现的不同,可能会节省总成本。
vzn

闪存驱动器需要使用一种复制垃圾回收的形式,该形式考虑了将内存排列成块的方式,尽管我不知道学术文献中对这种事情的讨论程度如何。那里要解决的问题非常不同(闪存驱动器需要GC,因为空间只能在非常大的块中回收,因此,如果一个块中有几个活动页面和许多无效页面,则必须将活动数据复制到该页面之前的其他位置可以回收),但合并数据的原则可能会有所帮助。
超级猫

1
在数据项相对于我的内存块大小都较小的情况下,我使用的一种模式是让每个数据项都包含一个固定大小的标头,该标头前后分配,而可变大小的数据从头到尾分配。一个表将逻辑块地址映射到物理地址,并保留每个块中的可用空间量;每次扫描后,它还将确定有多少空间已耗尽。引用存储在闪存中,每个引用的格式为“逻辑块#7的项目#3”。GC周期会将所有实时数据从一个块复制到一个新块,然后...
超级猫

Answers:


8

我记得,复制收集器应该是分页友好的,因为通过复制进行跟踪会改善指针引用的局部性。这对程序(变量器)有积极的影响,在跟踪链接时将减少较少的页面错误,并且由于跟踪也将减少较少的页面错误,因此还将改善下一个收集周期。跟踪议程(应该先处理指针)可能会影响改善数据局部性的有效性。这可以通过测量关于在不同类型的单元中对不同指针的访问次数的统计来改善。

现在,如果您通常考虑使用跟踪收集器,则通常必须维护一个结构来跟踪尚未跟踪的指针。可能有可能组织此结构,以便将指向同一页面的所有等待指针保持在一起(尽管在某些情况下,这可能会占用更多空间,具体取决于保留此类指针列表的可用技术)。然后一种可能的策略是,当内存中没有等待的指针时,总是先跟踪指向同一页面的最大等待指针集。

关于在我回答之后添加的第三段中的问题,副本收集还是一个答案。由于页面已完全释放,因此操作系统可以在收集时减少分配的物理页面的数量。使用标记和清除收集器,整页无蜂的事件可能会少得多,因此不值得考虑特定的机制。

这种想法很自然,并且可能在某些论文中有所描述。但是我不记得它是如何使用的。我认为有关Lisp GC的早期论文包含其中一些想法(例如:应首先遵循car还是cdr?)。

在副本收集这一角色中的好消息还在于,分页对副本收集很友好,因为它增加了可用的存储空间。回想一下,复制收集器原则上需要的空间是实际数据存储空间的两倍。现在,分页的效果还取决于计算机的地址空间以及可用的物理内存。在较旧的计算机中,物理内存远远小于可用的地址空间,因此分页实际上是一种空间奖励,从而允许使用诸如复制GC之类的策略。即使物理空间与地址空间一样大,也可能要共享它,以便使用GC的进程在不进行分页的情况下也将具有较少的地址空间(请参阅分页))。这些说法由于使用了世代收集器而显得有些多余。由于这些特质,并且因为年轻一代大多是短命的,所以他们通常将拷贝收集用于年轻一代。

然后,您拥有了世代GC与缓存系统的所有交互,在上一个问题中已经进行了讨论:世代垃圾收集器固有地对缓存友好吗?

有关这些问题的更多信息,我将使用关键字垃圾收集本地性等在网络上搜索。


怀疑副本收集器实际上比跟踪更“本地化”。复制收集器在概念上似乎在内存访问动态方面(可能几乎无法区分)与“旧空间”上的跟踪非常相似。认为这需要参考。那表示复制机制有可能改善新空间的连续性。新空间开始时是完全连续的,但是随着时间的流逝,这种“局部性”会降低或降低。
vzn

好吧,您找到了大部分答案。所以不要怀疑。它在该主题的基础参考中。局部性来自于压缩存储的事实,以及来自复制的复制,这些复制根据指针结构(可能随着指针重新分配而发展)在逻辑上接近于彼此相邻的数据单元。
babou

我仍然对此表示怀疑/怀疑。直观上看,当开始复制/ gc循环时,旧空间的位置和/或连续性较差。位置与读取(从旧空间)写入(到新空间)有关。要对其进行分析,必须研究格式塔/紧急情况行为。可能只有凭经验才能有效/准确/现实地研究其中的大部分,而在理论上却不是很多。
vzn

我说的是它像许多其他东西一样存在于文学中。但是我没有时间去搜索它,我认为我的回答冗长又塞满了信息。,您可以google:垃圾回收副本位置,这里有一个关于上一个问题的参考。对不起,很抱歉,有火车要赶上。
babou

抱歉,这个问题与另一个还有更多问题相混淆。
babou

8

Emery Berger,Matthew Hertz和Yi Feng在此方面做了一些工作。

垃圾回收具有许多软件工程优势,但是与虚拟内存管理器的交互很差。现有的垃圾收集器需要的页面比应用程序的工作集和触摸页面要多得多,而与内存中的页面无关,尤其是在全堆垃圾收集期间。产生的页面调度会导致吞吐量骤降,暂停时间会激增至几秒甚至几分钟。

我提出了一个避免分页的垃圾收集器。该书签收集器与虚拟内存管理器协作以指导其驱逐决策。

这是埃默里(Emery)的演讲视频,他写了一篇论文《无分页的垃圾收集》

由于某些原因,以后似乎没有太多工作要做,也没有任何“现实世界”的用法。在文章的最后,它说:“我们正在开发书签收集算法的并发变体”,但我无法对其进行追踪。

CRAMM:对垃圾收集应用程序的虚拟内存支持着眼于更改操作系统以使GC创建更少的分页。

使用页面驻留时间来平衡垃圾回收中的权衡

我们引入了一个主要是复制集合的扩展,该扩展使用页面驻留来确定何时重新定位对象。我们的收藏家会提升具有较高驻留率的页面,从而避免不必要的工作和浪费的空间。它可以预测每个页面的驻留时间,但是当其预测不准确时,我们的收集器可以通过使用它来满足分配请求来回收未占用的空间。使用驻留性可以使我们的收集器动态地平衡复制和非复制收集的权衡。我们的技术比纯复制收集器需要更少的空间,并支持对象固定,而不会牺牲对象的重定位能力。与其他混合方法不同,我们的收集器不依赖于特定于应用程序的配置,并且可以快速响应变化的应用程序行为。我们的测量结果表明,我们的混合动力车在各种条件下均表现良好;当堆空间足够大时,它更喜欢复制收集,但是当空间有限时,它会选择不复制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.