GC标记-清除算法(Mark Sweep GC)
GC算法是对堆空间进行的内存管理,一般堆空间会按内存分配成大小相等的块,并用链表串连起来,比如free_list表示可用空间。
标记清除算法主要有两部分即标记和清除,实现垃圾回收,但垃圾回收之外,还有对应的内存分配,以及垃圾回收后的碎片整理等。
gc(){
mark()
sweep()
}
标记阶段:mark()函数是会对根对象进行遍历,实现活动的对象的标记,即标记说话费的时间与活动对象的总数成正比;mark时时,对象的搜索主要有dfs和bfs,但dfs所用的内存空间较少一半用dfs。
什么样的对象是活动的?
根对象下所有包含的对象,即整个结构下都有记录,这样的对象时活动的;对于没有记录的对象,即对于程序而言是不会再用到的,这样的对象就是可回收的垃圾。
所以,对于有gc的语言,我们不需要进行动态空间的回收处理,当我们不需要时,即没有记录了,gc算法会自动处理。
清除阶段:sweep()函数,遍历所有的对,回收为标记的对象(垃圾),取消活动对象的标记,为下次mark即gc刷新;清除所花费的时间和堆的大小成正比。
<