停止然后复制(下面简写成 “止复”)是一另种消除碎片的垃圾回收技术。
步骤是把可用内存一分为二。一半等待,一半操作。当这一半的内存必须要进行垃圾回收时,回收器会从根指针开始遍历堆。
对于每个遍历到的节点,把他们复制到等待的那一半内存里。通过一种特殊技术保持 links 有效。
复制完成后,等待堆和操作堆角色互换。
过程中,所有无法触及的节点都会留在现在的等待堆。
止复的开始:在等待堆(tospace)新建两个指针,写指针和读指针。以及两个过程,疏散(evacuation)和 清除(scavenging)。开始是疏散根对象。然后清除。
疏散:将对象复制到写指针,写指针前进。然后在对象的旧地址(fromspace 上),新建一个中继对象,也叫破碎的心(broken heart),包含对象的新地址。
清除:读指针会检查 tospace 上对象里的指针。如果某个指针指向 fromspace 上的对象x,那个x就会被疏散。如果指向一个破碎的心,那就把指针地址改成新地址。对象完成清除,读指针前进。
一个对象被清除,意味着更多的对象被疏散,最终全部对象也被清除。最终在读指针和写指针相遇时,止复完成。