标记清除算法

标记清除算法

  • 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
    • 位图标记
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值