复制垃圾收集器

时间:2010-12-07 22:47:13

标签: garbage-collection heap memory-fragmentation

复制垃圾收集器如何避免内存碎片?另外,堆空间使用会带来什么后果?

根据我的理解,复制垃圾收集器将所有可到达的对象从堆复制到堆的另一部分。不再需要所有留下的物体,因此将其移除。

如果这是一个正确的理解,这如何避免内存碎片?

这个过程必须使用大量的堆空间,因为它会复制它复制的所有项目,对吗?

3 个答案:

答案 0 :(得分:2)

  

如果这是一个正确的理解,这如何避免内存碎片?

因为当您将对象复制到“新堆”时,您可以将它们紧挨着放在一起,而不会留下任何空隙。

  

这个过程必须使用大量的堆空间,因为它会复制它复制的所有项目,对吗?

仅在收集过程中。完成后,所有“原件”都被取消分配,并且该空间再次被释放。

此外,像这样的垃圾收集器通常是“世代”的 - 复制垃圾收集用于短期对象,长寿命对象的处理方式不同。这有助于缓解空间问题,并减少收集时间。

答案 1 :(得分:1)

您的基本理解是正确的。它避免了碎片,因为它复制了可到达的对象,然后它可以放在一起,在一个块中留下自由空间。它确实需要很大的空间,事实上,它需要2倍的空间加上一些记账的变化。

答案 2 :(得分:1)

当在两个活动块之间释放内存块时,会发生内存碎片。想想一块像这样的记忆......

AAAAAAAAAAAAAAAABBBBCCCCCCCCCCCC

假设不再需要B.如果我们释放B正在使用的空间我们有类似......

AAAAAAAAAAAAAAAA----CCCCCCCCCCC

现在我们有一个差距,我们只能放入相当小的物体。复制垃圾收集器可能会移动东西,以便我们有......

AAAAAAAAAAAAAAAACCCCCCCCCCC---- (more free space here

大多数现代收藏家都可以就地搬家。也就是说,你可以看到C如何“转移”以占用B的旧空间,从而没有内存开销。