在垃圾回收的上下文中,我不明白"generations"是什么意思。 能否简单解释一下?
代
代垃圾收集器更频繁地收集短寿命对象而不是长寿命对象。短寿命对象存储在第一代,即0代中。长寿命对象被推入较高的1代或2代。垃圾收集器在低代中的工作频率比高代中更高。
当一个对象首次创建时,它被放置在0代中。当0代填满时,垃圾收集器被调用。在第一代中经过垃圾回收后幸存的对象将被提升到下一个更高的代,即1代。在1代中经过垃圾回收后幸存的对象将被提升到最高的2代。这个算法对于对象的垃圾回收非常有效,因为它很快。请注意,2代是垃圾收集器支持的最高代。
代际
虽然托管堆上的内存分配很快,但GC本身可能需要一些时间。考虑到这一点,进行了几项优化以提高性能。GC支持代际的概念,基于这样的假设:对象在堆上存在的时间越长,它就可能在那里停留的时间也越长。当对象在堆上分配时,它属于第0代。每次垃圾回收中,对象幸存下来都会将其代数增加1(目前支持的最高代数为2)。显然,搜索和垃圾回收堆上所有对象的子集速度更快,因此GC有选项仅收集第0、1或2代对象(或任何组合,直到具有足够的内存)。即使只收集年轻对象,GC也可以确定旧对象是否引用新对象,以确保不会无意中忽略正在使用的对象。
在《Pro C# 2008》中有一个很好的描述:
我的博客,垃圾回收的世代, 回答了你的问题:
CLR的垃圾回收器(GC)是一种世代垃圾回收器,也称为暂时性垃圾回收器。
它有三个世代:
第0代:
包含所有从未被GC检查过的新构造对象。
第1代:
当CLR初始化时,选择一个以kb为单位的预算大小用于第0代。如果创建对象导致第0代超过其预算大小,则启动垃圾回收。未在第0代中收集的对象将移动到第1代,并清空第0代。 假设第0代的预算相当于5个对象的大小。那么在创建第6个对象之前,第0代如下所示:
创建对象6后,垃圾分配开始,释放垃圾对象1、3和5,并将2和4相邻地移动到第一代。
一代的预算大小也是在初始化时由CLR选择的。创建对象11会导致GC再次启动,这可能会将更多的对象移动到一代。
Generation 1在垃圾回收达到其预算大小之前被忽略,这可以提高GC的性能。
基本上,Generation GC 假设新对象更有可能被收集。