【发布时间】:2010-05-16 04:46:50
【问题描述】:
他们说压缩垃圾收集器比传统的内存管理更快,因为它们只需要收集活动对象,并且通过在内存中重新排列它们以便所有内容都在一个连续的块中,最终不会产生堆碎片。但是如何快速完成呢?在我看来,这相当于装箱问题,即NP-hard,在我们目前对计算的了解范围内,无法在合理的时间内在大型数据集上完成。我错过了什么?
【问题讨论】:
-
我经常想知道这一点。 Mono 没有碎片整理垃圾收集器来压缩堆,但 Microsoft 的 .NET 有。他们是怎么做到的?
-
压缩不是装箱:在装箱中,必须回答“是否有可能用这些块中的一些块完全填充这个空间?”。压缩 GC 没有这样的问题,压缩通常与实时内存的大小成线性关系。
-
@Callum Rogers 一种方法是:第 1 阶段 - 就地反转所有指针,以便孩子指向他们的父母。阶段 2 - 将具有最低地址的活动块移动到堆的最开始。使用倒置指针更新所有父母。在第一个之后移动具有最低地址的第二个活动块......第 3 阶段 - 再次反转所有指针。
标签: algorithm garbage-collection