【问题标题】:Copying Garbage Collector复制垃圾收集器
【发布时间】:2010-12-07 22:47:12
【问题描述】:

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

据我了解,复制垃圾收集器会将所有可访问的对象从堆中复制到堆的另一部分。所有遗留的对象都不再需要,因此被移除。

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

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

【问题讨论】:

标签: garbage-collection heap-memory memory-fragmentation


【解决方案1】:

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

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

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

仅在收集过程中。完成此操作后,所有“原件”都将被释放,并再次释放空间。

此外,像这样的垃圾收集器通常是“世代相传的”——复制垃圾收集器用于生命周期较短的对象,而对生命周期较长的对象进行不同的处理。这有助于缓解空间问题,并减少收集时间。

【讨论】:

  • 肯定在更糟糕的情况下,这将需要 200% 的可用内存?想象一下 1GB 被分配,完全用完,然后复制 GC 运行——肯定需要额外的 1GB 堆,总共 2GB,才能将所有数据复制到原始堆释放之前?
【解决方案2】:

您的基本理解是正确的。它避免了碎片,因为当它复制可达对象时,它可以将它们放在一起,然后将可用空间留在一个块中。它确实需要大量空间,事实上,它可能需要 2 倍的空间以及一些记账变化。

【讨论】:

    【解决方案3】:

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

    AAAAAAAAAAAAAAAABBBBCCCCCCCCCCCC
    

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

    AAAAAAAAAAAAAAAA----CCCCCCCCCCC
    

    现在我们有一个间隙,我们只能将相当小的对象放入其中。复制垃圾收集器可能会移动东西,以便我们拥有...

    AAAAAAAAAAAAAAAACCCCCCCCCCC---- (more free space here)

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

    【讨论】:

      猜你喜欢
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 2020-03-06
      • 2010-12-14
      • 2019-06-07
      • 2010-10-24
      相关资源
      最近更新 更多