.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#》

你可能感兴趣的:(C#,C#,GC,垃圾回收)