分代垃圾收集器本质上是缓存友好的吗?


38

典型的世代垃圾收集器将最近分配的数据保留在单独的内存区域中。在典型程序中,大量数据是短命的,因此,频繁收集年轻垃圾(较小的GC周期)而很少收集旧垃圾是内存开销和执行GC时间之间的良好折衷。

直觉上,随着主内存相对于高速缓存的等待时间比率的增加,与单区域垃圾收集器相比,世代垃圾收集器的好处应该增加,这是因为经常访问年轻区域中的数据并将它们全部保存在一个地方。实验结果是否证实了这种直觉?


有关该问题的适当标签的相关元讨论
卡夫

Answers:


19

以下是几篇有关分代垃圾收集器的缓存含义的论文:

据我所知,主要的问题是垃圾回收系统会在内存空间之间进行权衡,以避免预先收集。缓存存储器也是如此。正如您所建议的,第一代中的内容很可能会放在缓存中,因此它们的分配和收集将比主内存中的内容或分页到磁盘的速度快得多。主要问题是相对于缓存大小的第一代大小。如果您的缓存在第一代之前就已填满,那么随着未命中的堆积开始,您将失去这些好处。


10

在某些说明中,可能会掩盖所有垃圾收集器的一个非常棘手的方面,那就是“完全扫描”或“完全收集”。他们必须定期,随机,间歇地扫描所有对象。分代收集器在推迟完整扫描和最小化扫描持续时间方面比较擅长,但这仍然是必需的。

分代收集器将专注于有时被称为“护理”空间的事物,但最终/不可避免地必须在“较旧”的生成空间中进行收集,从而对内存进行全面扫描。

在这种情况下,几乎所有的内存缓存/虚拟化方案都将/必须在任何性能改进方面严重失败,因此这种完全扫描与几乎所有的内存缓存和(尤其是!)虚拟化方案都不兼容。

因此,此问题的关键答案是全扫描被触发的频率,其发生时的影响有多“坏”以及是否可以容忍。这归结为更多与应用程序相关的属性/问题。

换句话说,对于收集器的“大部分”操作,缓存可能会有所帮助(缓存和“年轻的”苗圃空间通常会重叠!),但是会出现周期性的,间歇的,最终的,不可避免的,沉重的,当“旧一代”空间被完全收集并且高速缓存的“命中率”将降级到非常糟糕的时候,甚至性能的“大规模” [降级]尖峰,因为外部的许多对象都被完整地以紧密的循环获取扫描/收集周期。换句话说,不可避免的周期性不连续性(统计估计/平均/绩效趋势等具有误导性和不适用性)。

现在出现的是一些新的收集系统,这些收集系统旨在与基础内存管理系统(缓存/虚拟化)啮合。确实,完全将内存收集,缓存和虚拟化的各个系统分离开来的历史方法的效果不如将所有三个方面组合/集成/寻址在一起的方法。

参见例如Zhou和Demsky的缓存感知垃圾收集。


因此,您可以争辩说,与非世代(经典)相比,世代GC更易于缓存吗?
拉斐尔

我认为,GC应该以集成的方式进行设计,并将缓存和虚拟内存作为其设计的一部分,这在现有体系结构中是棘手的。但是要扩展答案-是的,世代收集器将常用对象聚合/合并/分组到连续内存中,这比其他设计中频繁使用和不常用对象分散/混合的固有缓存缓存兼容性更高(尽管后者仍然会有一些缓存优势)。
vzn 2012年

1
合并GC和缓存/虚拟化体系结构的一个比较棘手的方面是,此类体系结构通常不关心内存页面的内容,但是在GC系统中,它们是必需的。有时,不同的语言会向程序员承诺与GC相关的不同功能,因此很难确定在OS级别上要支持哪些功能。最好的方法可能是说每个对象都需要包含一个指向结构的指针,该结构的初始字段由OS定义,但是可能会跟随OS不知道或不在意的特定于语言的数据。
超级猫
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.