标记-压缩算法顾名思义,就是标记活动对象,再对活动对象进行压缩到堆的一边,两部分组成。标记-压缩算法效果和复制算法差不多,但是有点在于他不用牺牲半个堆的空间。
首先,我们介绍最初由Kunth研究出来的标记-压缩算法Lisp2
Lisp2
lisp2算法中每个对象头中都开辟新空间用来存放forwarding指针。forwarding指针用来指示活动对象将要被压缩过去的空间地址。
算法首先是标记阶段,标记和之前标记-清除算法的标记一样,这里不再赘述,标记完成后堆的状态如图:
算法第一步:设定forwarding指针。算法中存在两个指针scan,new_address。
scan:用来扫描堆中的对象。
new_address:寻找空闲空间并且用来指示对象新的目标地点。
第一步中,scan用来扫描对象,一旦找到活动的对象就会将对象中forwarding指针从NULL跟新到new_address的地址。第一步完成后,结果如下图
第二步:更新指针。第一步指定活动对象将被移动后的新地址后,这一步将由SCAN指针继续扫描,更新所有活动对象的指针,包括根指到对象新地址的指针和对象间引用的指针。第二步完成后如图: