节点复制算法
这次考察的也是一种基于追踪的算法:节点复制算法。节点复制式收集器将整个堆等分成为两个半区(semi-space),一个包含现有的数据,另一个包含已被废弃的数据,节点复制式垃圾收集从filp两个半区的角色开始。然后收集器在老的半区,也就是Fromspace中遍历存活的苏话剧结构,在第一次访问某个单元时把它复制到新的半区,也就是Tospace中去。在Fromspace中所有存活单元都被访问过之后,收集器在Tospace中建立了一个存活数据结构的副本,用户程序可以重新开始运行了,由于垃圾单元只是简单地被废弃在Fromspace中,人们常常把节点复制式收集器描述为“清道夫”:它们从垃圾中捡起有价值的对象并把对象带走。
节点复垃圾收集天生就具有一个有益的副作用:u哦有存活的数据结构都缩并地拍额在Tospace的底部。与那些存在内存碎片问题的收集器相比,缩并的收集器能能否更高效的分配对象。New过程只需要检查有没有足够的空间,然后在递增指向自由空间开始处的指针free。由于存活数据在Tospcae中式缩并的,检查空间是否足够仅仅只是一个指针比较而已。节点复制式收集器能够自然地处理可变大小的对象,因此我们把对象的大小作为参数n传递给New过程。和Mark-Sweep技术一样,节点复制技术不会给像更新这样的用户程序操作带来外的负担。
//节点复制式收集器中的分配
init() =
Tospace = Heap_bottom
space_size = Heap_size / 2
top_of_space = Tospace