GC标记-清除算法(Mark Sweep GC)
GC标记-清除算法自问世以来,一直到半个世纪后的今天,依然是处理各类程序的所用的经典算法。典型的标记-清除算法很简单,
现在更常用的是与其他的算法巧妙结合达成意想不到的效果。
GC标记-清除算法顾名思义,就是标记和清除。标记活动的对象,清除没有标记或者是说没有在活动的对象。
标记:
在标记阶段中,垃圾收集器会给所有活动打上标记即mark=true。标记函数根据传入的参数为根,由根(链表头)再逐步搜索(一般采用深度
优先搜索,因为DFS比BFS更能压低内存使用量),直到没有下一个对象为止。做为一名工程师看看伪代码或许更能理解这个过程。
mark_phase() {
for(r:$roots) //遍历所有根
marks(*r)
}
mark(obj) {
if(obj.mark == false) //设置标记位
obj.mark = true
for(child: children(obj)) 遍历以该根为起点的对象
mark(*child)
}
清除 :
和标记阶段相同,清除阶段也同样需要遍历堆空间中所有的对象。若对象标记位为false则进行垃圾回收处理,在最典型的标记-清除算法中
是对每一个对象的空间利用头插法建立空闲链表。

GC标记-清除算法是经典垃圾回收策略之一,包括标记和清除两个阶段。标记阶段标记所有活动对象,清除阶段回收未标记对象的内存。通过深度优先搜索标记活动对象,并在清除阶段建立空闲链表,使用First-fit策略分配内存。
标记-清除算法&spm=1001.2101.3001.5002&articleId=113186067&d=1&t=3&u=59a0a0e02c5b49f2ba1dce33a16d9a50)
1万+

被折叠的 条评论
为什么被折叠?



