标记清除算法实现原理 和 优缺点

标记清除算法

  • 核心思想:分标记和清除第二个阶段完成
  1. 遍历所有对象找到标记活动(可达)对象
  2. 遍历所有对象清除没有标记对象
  3. 回收相应的空间

第一个阶段遍历所有对象,找到可达对象并标记,

第二个阶段遍历所有对象清除没有标记的对象,并抹除可达对象的标记

 在全局上可以找A、B、C三个可达对象,找到之后发现下面还有D、E子引用,GC算法会用递归的方式继续找到可达对象。而 a1 和 b2 可能位于局部作用域中,在函数执行完后被回收了,global找不到 a1 和 b2的,GC机制认为它就是一个垃圾对象,没有去给它做标记。在随后被清除掉,释放空间,把空间放在空闲列表上面,方便后面的程序直接在上面申请空间使用

标记清除算法优缺点

 在函数内定义a1 和 b1相互引用,函数调用在结束后,释放内部的空间,局部上失去了在global上的连接,a1 和 b1 在全局的根下没有办法可以访问到,这个时候就是不可达对象,在做标记的时候没有标记,在标记清除算法第二个阶段回收的时候,找到这些没有标记的对象,进行释放。所以标记清除算法 解决了 引用计数算法 不能清除循环引用的问题

标记清除算法的缺点

地址不连续,空间碎片化

 当前红色标注的区域我们认为这是A 对象,左右两个有无法从根下查找的区域,称为B和C,在进行第二轮清除操作的时候,会直接将B和C对应的空间进行回收,把释放的空间添加到空闲链表之上,后续的程序可以直接进来在空闲链表上申请相应的空间地址进行使用,在这种情况下会有问题,比如我们空间有两个部分组成:一个是存储空间的元信息的(大小,地址)我们称之为头,一个是用于存储数据的,我们称为域。左右两侧的空间B对象有两个域的空间,C对象有1个域的空间,虽然看起来释放的空间加起来有三个域的空间,但是由于中间被A 对象分割着,在释放完成之后,造成了地址不连续。如果后续要申请空间刚好是 1.5个域,这种情况下,B的空闲空间是多了0.5个域,而C的域空间又不够。这就是标记清除算法的缺点地址不连续,空间碎片化。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值