标记-压缩算法

来源:互联网 发布:php技术有哪些 编辑:程序博客网 时间:2024/04/29 21:02

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
原创粉丝点击