典型的世代垃圾收集器将最近分配的数据保留在单独的内存区域中。在典型程序中,大量数据是短命的,因此,频繁收集年轻垃圾(较小的GC周期)而很少收集旧垃圾是内存开销和执行GC时间之间的良好折衷。
直觉上,随着主内存相对于高速缓存的等待时间比率的增加,与单区域垃圾收集器相比,世代垃圾收集器的好处应该增加,这是因为经常访问年轻区域中的数据并将它们全部保存在一个地方。实验结果是否证实了这种直觉?
典型的世代垃圾收集器将最近分配的数据保留在单独的内存区域中。在典型程序中,大量数据是短命的,因此,频繁收集年轻垃圾(较小的GC周期)而很少收集旧垃圾是内存开销和执行GC时间之间的良好折衷。
直觉上,随着主内存相对于高速缓存的等待时间比率的增加,与单区域垃圾收集器相比,世代垃圾收集器的好处应该增加,这是因为经常访问年轻区域中的数据并将它们全部保存在一个地方。实验结果是否证实了这种直觉?
Answers:
以下是几篇有关分代垃圾收集器的缓存含义的论文:
据我所知,主要的问题是垃圾回收系统会在内存空间之间进行权衡,以避免预先收集。缓存存储器也是如此。正如您所建议的,第一代中的内容很可能会放在缓存中,因此它们的分配和收集将比主内存中的内容或分页到磁盘的速度快得多。主要问题是相对于缓存大小的第一代大小。如果您的缓存在第一代之前就已填满,那么随着未命中的堆积开始,您将失去这些好处。
在某些说明中,可能会掩盖所有垃圾收集器的一个非常棘手的方面,那就是“完全扫描”或“完全收集”。他们必须定期,随机,间歇地扫描所有对象。分代收集器在推迟完整扫描和最小化扫描持续时间方面比较擅长,但这仍然是必需的。
分代收集器将专注于有时被称为“护理”空间的事物,但最终/不可避免地必须在“较旧”的生成空间中进行收集,从而对内存进行全面扫描。
在这种情况下,几乎所有的内存缓存/虚拟化方案都将/必须在任何性能改进方面严重失败,因此这种完全扫描与几乎所有的内存缓存和(尤其是!)虚拟化方案都不兼容。
因此,此问题的关键答案是全扫描被触发的频率,其发生时的影响有多“坏”以及是否可以容忍。这归结为更多与应用程序相关的属性/问题。
换句话说,对于收集器的“大部分”操作,缓存可能会有所帮助(缓存和“年轻的”苗圃空间通常会重叠!),但是会出现周期性的,间歇的,最终的,不可避免的,沉重的,当“旧一代”空间被完全收集并且高速缓存的“命中率”将降级到非常糟糕的时候,甚至性能的“大规模” [降级]尖峰,因为外部的许多对象都被完整地以紧密的循环获取扫描/收集周期。换句话说,不可避免的周期性不连续性(统计估计/平均/绩效趋势等具有误导性和不适用性)。
现在出现的是一些新的收集系统,这些收集系统旨在与基础内存管理系统(缓存/虚拟化)啮合。确实,完全将内存收集,缓存和虚拟化的各个系统分离开来的历史方法的效果不如将所有三个方面组合/集成/寻址在一起的方法。