标记-压缩算法

GC标记压缩算法由标记阶段和压缩阶段组成,标记阶段和标记-清除算法的完全一致

接下来,要搜索多次堆来进行压缩,压缩阶段通过数次搜索堆来重新装填活动对象

压缩阶段不会改变对象的排列顺序,只是缩小彼此间的空隙,使他们聚集到堆的一端

  
  
  1. compaction_phase(){
  2. set_forwarding_ptr() //设定forwarding指针
  3. adjust_ptr() //更新指针
  4. move_obj() //移到对象
  5. }

1)它会搜索整个堆,给活动对象设定forwarding指针,假设初始阶段的forwarding指针为NULL

2)一旦找到活动对象,就将forwarding指针的引用目标从NULL指向new_address

3)通过对象copy把活动对象集中到堆的最左侧


优点:堆的利用效率高

缺点:需要多次搜索整个堆,所以,吞吐量较低(耗时较长)


#### Two-Finger算法:

1)移到对象:使用$free和$live两个指针开始搜索,free指针寻找非活动对象,live指针寻找活动对象,分别从堆的两端开始搜索,当free指向非活动对象,live指向活动对象时,交换空间,直到两个指针交叉,意味着搜索结束

2)更新指针,将指针的引用目标更新到移动后的对象


优点:

1)不用专门为forwarding指针留出域,不需要额外的内存空间

2)节省了一次堆的遍历搜索

缺点:

1)不考虑对象间的引用关系,一味压缩,使对象顺序发生很大的变化,具有引用关系的对象可能相距较远,没办法利用缓存了

2)它要求各个对象的大小必须一致,能消除这个限制处理的系统不多,所以限制了它的使用





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值