复制垃圾收集器如何避免内存碎片?另外,堆空间使用会带来什么后果?
根据我的理解,复制垃圾收集器将所有可到达的对象从堆复制到堆的另一部分。不再需要所有留下的物体,因此将其移除。
如果这是一个正确的理解,这如何避免内存碎片?
这个过程必须使用大量的堆空间,因为它会复制它复制的所有项目,对吗?
答案 0 :(得分:2)
如果这是一个正确的理解,这如何避免内存碎片?
因为当您将对象复制到“新堆”时,您可以将它们紧挨着放在一起,而不会留下任何空隙。
这个过程必须使用大量的堆空间,因为它会复制它复制的所有项目,对吗?
仅在收集过程中。完成后,所有“原件”都被取消分配,并且该空间再次被释放。
此外,像这样的垃圾收集器通常是“世代”的 - 复制垃圾收集用于短期对象,长寿命对象的处理方式不同。这有助于缓解空间问题,并减少收集时间。
答案 1 :(得分:1)
您的基本理解是正确的。它避免了碎片,因为它复制了可到达的对象,然后它可以放在一起,在一个块中留下自由空间。它确实需要很大的空间,事实上,它需要2倍的空间加上一些记账的变化。
答案 2 :(得分:1)
当在两个活动块之间释放内存块时,会发生内存碎片。想想一块像这样的记忆......
AAAAAAAAAAAAAAAABBBBCCCCCCCCCCCC
假设不再需要B.如果我们释放B正在使用的空间我们有类似......
AAAAAAAAAAAAAAAA----CCCCCCCCCCC
现在我们有一个差距,我们只能放入相当小的物体。复制垃圾收集器可能会移动东西,以便我们有......
AAAAAAAAAAAAAAAACCCCCCCCCCC---- (more free space here
)
大多数现代收藏家都可以就地搬家。也就是说,你可以看到C如何“转移”以占用B的旧空间,从而没有内存开销。