图解GC(垃圾回收)标记-压缩算法

标记-压缩算法顾名思义,就是标记活动对象,再对活动对象进行压缩到堆的一边,两部分组成。标记-压缩算法效果和复制算法差不多,但是有点在于他不用牺牲半个堆的空间。

首先,我们介绍最初由Kunth研究出来的标记-压缩算法Lisp2

Lisp2

lisp2算法中每个对象头中都开辟新空间用来存放forwarding指针。forwarding指针用来指示活动对象将要被压缩过去的空间地址。

算法首先是标记阶段,标记和之前标记-清除算法的标记一样,这里不再赘述,标记完成后堆的状态如图:

图解GC(垃圾回收)标记-压缩算法_第1张图片

算法第一步:设定forwarding指针。算法中存在两个指针scan,new_address。

scan:用来扫描堆中的对象。

new_address:寻找空闲空间并且用来指示对象新的目标地点。

第一步中,scan用来扫描对象,一旦找到活动的对象就会将对象中forwarding指针从NULL跟新到new_address的地址。第一步完成后,结果如下图

图解GC(垃圾回收)标记-压缩算法_第2张图片

第二步:更新指针。第一步指定活动对象将被移动后的新地址后,这一步将由SCAN指针继续扫描,更新所有活动对象的指针,包括根指到对象新地址的指针和对象间引用的指针。第二步完成后如图:

图解GC(垃圾回收)标记-压缩算法_第3张图片

第三步,移动对象。这次,继续用scan扫描活动对象,将所有活动对象移动到forwarding指针指向的目标地址,实现压缩的效果。

图解GC(垃圾回收)标记-压缩算法_第4张图片

 

Lisp2算法核心理解起来很简单,只是画起图来有点麻烦而已。这次标记-压缩算法活动被压缩到堆的一边实现典型复制算法有利于缓存和快速分配空闲空间的好处,况且堆的利用空间差不多是典型复制算法的两倍,(注意:每个对象比典型复制算法多了个forwarding指针的空间)。缺点:Lisp2必须对堆进行3次搜索,执行的时间与堆的大小成正比。

 

 

 

 

 

你可能感兴趣的:(算法)