复制垃圾收集器如何避免内存碎片?此外,堆空间使用会产生什么后果?
据我了解,复制垃圾收集器会将所有可访问的对象从堆中复制到堆的另一部分。所有留下的对象都不再需要并因此被删除。
如果这是一个正确的理解,那么这如何避免内存碎片呢?
这个过程必须使用大量的堆空间,因为它复制的所有项目都会重复,对吗?
复制垃圾收集器如何避免内存碎片?此外,堆空间使用会产生什么后果?
据我了解,复制垃圾收集器会将所有可访问的对象从堆中复制到堆的另一部分。所有留下的对象都不再需要并因此被删除。
如果这是一个正确的理解,那么这如何避免内存碎片呢?
这个过程必须使用大量的堆空间,因为它复制的所有项目都会重复,对吗?
如果这是一个正确的理解,那么这如何避免内存碎片呢?
因为当您将对象复制到“新堆”时,您会将它们彼此相邻而不会留下任何间隙。
这个过程必须使用大量的堆空间,因为它复制的所有项目都会重复,对吗?
仅在收集过程中。完成此操作后,所有“原件”都将被释放,并且该空间再次被释放。
此外,像这样的垃圾收集器通常是“世代相传的”——复制垃圾收集器用于短期对象,而对长期对象进行不同的处理。这有助于缓解空间问题,并减少收集时间。
Your basic understanding is correct. It avoids fragmentation because as it copies the reachable objects, it can put then close together, leaving free space in one block. it does require lots of space, in fact, it requires potentially 2x the space plus some change for bookkeeping.
当内存块在两个活动块之间被释放时,就会发生内存碎片。想像这样的一块内存......
AAAAAAAAAAAAAAAABBBBCCCCCCCCCCCC
假设不再需要 B。如果我们释放 B 正在使用的空间,我们就会有类似...
AAAAAAAAAAAAAAAA----CCCCCCCCCCC
现在我们有一个间隙,我们只能放入相当小的对象。复制垃圾收集器可能会移动东西,以便我们有......
AAAAAAAAAAAAAAAACCCCCCCCCCC---- (more free space here
)
大多数现代收藏家都可以将物品原地移动。也就是说,您可以看到 C 如何被“转移”以占用 B 的旧空间,因此没有内存开销。