.Net GC机制之Generation(分代)

.Net GC机制基于三个假设

  • 对象越新,生存期越短
  • 对象越老,生存期越长
  • 回收部分数据会比回收全部数据,性能更高

    基于以上的假设,内存回收过程中,不会一次性回收所有的数据,而是将数据会分为三代(目前只支持三代)。

  • Generation-0 : 当Generation-0已满时,进行一次GC,存活下来的对象会进入Generation-1
  • Generation-1: 当要进行GC时,发现Generation-1已满,就对Generation-1元素进行GC,存活的元素移至Generation-2;再对Generation-0元素进入GC,存活的元素移至Generation-1
  • Generation-2: 如果发现Generation-2已满,那没办法了,只能加大Generation-2的空间大小。

    程序初始时,Generation-0/1/2的大小分别是256KB / 2MB / 10MB。
    .Net的GC算法会根据程序的行为记录,自动调整Generation-0/1/2的大小,提高程序运行效率。
    以Generation-0的GC回收机制为例。假如回收后发现从Generation-0中保留的对象很少,则将它的空间从256KB减至126KB;如果发现GC后保留的对象很多,则它的空间增至512KB。

    减少Generation的空间会引起更频繁的GC,但是每次GC处理的数据量较少,同时还能减少进程工作集的大小。
    增加Generation的空间会减少GC的次数,而每次GC处理的数据量会较多。

    如果Generation增加时,发现内存不够,程序就会抛出OutOfMemory异常。

    参考:《CLR via C#》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值