标记清除算法
- GC里面字面的意思进行理解就行,就是有标记阶段和清除阶段构成。标记阶段就是把所有的活动对象做上标记,清除阶段就是把那些没有标记的对象进行清除。
- 伪代码
mark_sweep()_{
//标记阶段
mark();
//清除代码
sweep();
}
mark(){
//对 root 对象进行遍历 标记
for( r : $root){
mark_object(r);
}
}
mark_object(obj){
//标记 在对象的头进行标记
//为true的时候 不进行处理 避免循环依赖
if(obj.mark == false){
obj.mark == true;
//children 函数是得到相关联的对象
for(child : childern(obj)){
mark_obj(child);
}
}
}
sweep_phase(){
//$heap_start 是堆头 $heap_end 堆尾
//sweeping 进行遍历的t
sweeping = $heap_start;
while(sweeping < $heap_end){
//如果是true的话 重置为false
if(sweeping.mark == TRUE){
sweeping.mark = FALSE
}else{
//为false 就将空间放到空闲列表
sweeping.next = $free_list;
$free_list = sweeping;
}
sweeping += sweeping.size ;
}
}
//分配空间
new_obj(size){
//从空闲列表里面进行分配 大于或者等于size的空间
//没有就执行分配空间失败
chunk = pickup.chunk(size,$free.list);
if(chunk == null){
allocation.fail();
}
return chunk;
}
-
分配算法
- first-fit 遍历 第一个发现大于或等于的立刻返回
- best-fit 返回大于size的最小的分块
- worst-fit 找出最大的 进行切分size大小和剩余(但是会加大碎片化)
-
优点
- 实现简单
-
缺点
- 碎片化
- 分配速度(分配的时候 都是遍历空闲列表 进行查找)
-
优化
- 多个空闲列表
- BIBOP
- 位图标记