复制 (Copying GC) 算法最早由 Marvin Lee Minsky 于1963年在 A LISP Garbage Collector Algorithm Using Serial Secondary Storage 中提出。
复制算法的基本思想很简单,就是把整个堆空间一分为二,每次只使用一半的空间用于分配:
- 正在使用的空间叫做 From 空间,空置的另一半称为 To 空间;
- 执行 GC 时,将 From 空间的活动对象都复制到 To 空间,然后对整个 From 空间进行回收;
- 复制完成后,将 From 空间和 To 空间交换,即原来的 From 空间变成了 To 空间,原来的 To 空间变成了 From 空间,直到下一次 GC,两个空间再次交换。
复制算法的一大特点就是它关注的是活动对象,而不像之前提到的标记-清除算法及引用计数法,都是遍历查找非活动对象。