概述
复制算法就是将内存空间二等分, 每次只使用其中一块. 当执行GC时, 将A部分的所有活动对象集体移到B中, 就可以将A全部释放.
画个图就是:
在执行GC前, 内存长这样:
?...还记得标记清除算法的问题是什么吗? 内存碎片化严重. 现在好了, 碎片化问题解决了, 每次GC执行后, 内存空间都是连续的啦.
实现
想一想GC执行的步骤是什么?...而复制算法将所有可分配的内存都放到一起了, 直接切割即可.
更好的局部访问: 复制算法复制后将对象与子对象放到一起, 这样缓存在读取的时候就能够一起读取, 防止多次读取数据.
当然, 缺点也很明显....将堆一分为二, 使用效率急速下滑.
堆的使用效率低, 只有1/2
频繁的递归调用函数. 对栈的压力比较大, 但是我们都知道, 所有用递归能写的都可以换成循环来实现, 所以个人感觉这个并不是问题....我看到有一种多空间复制算法, 为了提高堆的使用效率. 将堆空间分成N份, 其中的两份使用复制算法, 剩余的使用其他方法执行GC. 我实在是没有明白这么做的好处在哪....