分代回收和RC Immix算法回收

分代垃圾回收就是通过优先回收容易成为垃圾的对象,从而提高垃圾回收的效率

频繁使用的对象,会被划分为老年代对象,一般进行GC时只在新生代对象中进行,当老年代对象挤满老年代空间时,就会执行老年代GC,使用的是标记清除算法

分配时在生成空间进行的,

1)如果生成空间有足够大小的分块,直接分配

2)如果没有,就会执行新生代GC,在执行新生代GC后就可以利用全部的生成空间,所以,只要生成对象的大小<生成空间,就一定可以分配到空间,大于则分配失败


复制:

1)如果复制对象使用次数不太高<age_max则复制到幸存空间,返回复制目标对象

2)使用频繁> age_max 则复制到老年代空念,空间不足则,执行老年代GC,执行完毕仍然不足则分配失败


优点:改善GC所花费的时间

缺点:在老年代对象比较多的程序中反而会起到反作用



#### 合并引用算法

合并引用算法:就是把注意力集中到某一时期的最初和最后的状态上,在改时期内不进行计数器的增减,指针改动的信息会被记录到更改缓冲区,此时各个对象的计数器很可能是不对的

等到更改缓冲区满的时候,才会运行GC查找更改缓冲区,并正确设置计数器的值

合并型引用计数法的写入屏障,不执行计数器的增减,只是检查改动指针的对象的标志是否已注册,若没有,则注册,看下代码

 
 
  1. write_barrier_coalesced_RC(obj,field,dst){
  2.    if(obj.dirty) //如果没有注册到更新缓冲区  $mod_buf
  3.      register(obj)  //把它注册进去
  4.    obj.field = dst
  5. }

优点:不是每次都进行计数器的调整而是在移动程度上一并执行,可以无视中间过程指针的变化,只要最终状态的指针引用是对的,见笑了频繁更新指针引用的压力

缺点:增加了mutator的暂停时间,因为在查找更改缓冲区的过程中需要让mutator暂停


#### 合并型引用计数法和Immix的融合

Immix中不是以对象为单位,而是以线为单位进行内存管理,如果线内一个活动对象都没有,就回收整个

RC Immix算法种既有对象计数器,也有线计数器

1)对象计数器表示的是执行这个对象的引用的数量

2)线计数器表示的是这个线里存在的活动对象的数量,若果线计数器的值变为0了,就会被回收掉

来看下RC Immix中的dec_ref_cn吧

  
  
  1. dec_ref_cnt(obj){
  2. obj.ref_cnt--
  3. if(obj.ref_cnt == 0) //如果对象的引用计数为0
  4. reclaim_obj(obj) //,将对象回收
  5. line = get_line(obj)
  6. line.ref_cnt-- //将线的引用计数减少1
  7. if(line,ref_cnt == 0) //如果线的引用计数为0
  8. reclaim_line(line) //该线可以被回收
  9. }

在RC Immix算法中,把没有经历过GC的对象称为新对象

注意:

1)新对象没有经历过GC,它是上次GC之后生成的,因此指向新对象的指针也是上一次GC之后生成的

2)更新缓冲区的记录是上次GC之后到现在为止指针改动过的对象

也就是所有引用新对象的对象都被注册到了更新缓冲区,所以,可以通过查找更新缓冲区来只对新对象进行复制操作,利用这条性质,RC Immix中以新对象为对象进行压缩,称为被动碎片整理

缺点:1)无法对旧对象进行压缩

2)无法回收有循环引用的垃圾


积极的碎片整理:首先觉得要复制到哪个块,然后把能够通过指针从根查找到的对象全部复制过去,使用的是GC标记-压缩算法,使得对旧对象压缩和回收循环垃圾都有了可能性,还有一个好处就是可以重置计数器

以引用计数法为基础时一般都会利用Sticky引用计数法,若果某个对象发生计数器溢出,就不能对其计数器进行增减了,只能就此搁置,若执行积极的碎片整理,就会重新从根查找所有的指针,也就能重新设定计数器的值


优点:

1)使引用计数法的最大缺点-吞吐量低得到了大幅度的改善,原因有2个,一个是合并型引用计数法的引入,没有写入屏障来执行计数器的增减操作,所有,即使对象间的引用关系频繁改变,吞吐量也不会下降太多,另一方面撤除了空闲链表,通过以线为单位来管理分块,只要在线内移动至真就可以进行分配,此外还省去了把分块重新连接到空闲链表的处理

缺点:和合并型引用计数法一样,会增加最大暂停时间,另外就是只要线内还有一个活动对象,整条线就没办法进行回收

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值