gc垃圾回收算法之一 标记-清除算法(Mark-Sweep)
什么是标记-清除算法?
GC标记-清理算法由标记阶段和清理阶段组成。标记阶段是把所有活动对象都做上标记的阶段。清理阶段是把没有标记的对象,即非活动对象回收的阶段。 通过这两个阶段,就可以重复利用内存空间了。
mark_sweep(){
mark_phase()
sweep_phase()
}
标记阶段
标记阶段,首先通过根对象标记直接引用的活动对象,然后递归标记所有能通过指针数组访问到的对象。这样就能标记所有活动对象了。 利用mark_phase()函数来进行标记阶段处理
mark_phase(){
for(r : $roots)
mark(*r)
}
# 标记函数
mark(obj){
if(obj.mark==false)
obj.mark = true
for(child : children(obj))
mark(*child)
}
标记阶段总结来说就是遍历所有对象并标记活动对象的过程。
我们在搜索对象时常使用深度优先搜索、广度优先搜索方法。
清除阶段
在清除阶段,collector会遍历整个堆,回收没有打上标记的对象(即垃圾),使其能再次得到利用。
sweep_phase(){
sweeping = $heap_start
while(sweeping < $heap_end)
if(sweeping.mark == true)
sweeping.mark = false
else
sweeping.next = $free_list
$free_list = sweeping
sweeping += sweeping.size
}