Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 垃圾收集的几代人是什么?_.net_Garbage Collection - Fatal编程技术网

.net 垃圾收集的几代人是什么?

.net 垃圾收集的几代人是什么?,.net,garbage-collection,.net,Garbage Collection,我不明白在垃圾收集的上下文中“世代”是什么。有人能简单地解释一下吗?在“Pro C#2008”中有一个很好的描述: 第0代标识从未标记为收集的新创建对象 第1代标识在GC中幸存的对象(标记为收集,但由于堆空间足够而未删除) 第2代标识一个对象,该对象在GC的多次扫描中幸存 从 几代人 分代垃圾收集器 收集寿命较短的对象 通常比长寿的人更长寿。 短寿命对象存储在 第一代,第0代。这个 寿命较长的对象被推入 更高的一代或两代。这个 垃圾收集器更有效 通常在下一代 比高一点的好 首次创建对象时,它是

我不明白在垃圾收集的上下文中“世代”是什么。有人能简单地解释一下吗?

在“Pro C#2008”中有一个很好的描述:

  • 第0代标识从未标记为收集的新创建对象
  • 第1代标识在GC中幸存的对象(标记为收集,但由于堆空间足够而未删除)
  • 第2代标识一个对象,该对象在GC的多次扫描中幸存
  • 几代人

    分代垃圾收集器 收集寿命较短的对象 通常比长寿的人更长寿。 短寿命对象存储在 第一代,第0代。这个 寿命较长的对象被推入 更高的一代或两代。这个 垃圾收集器更有效 通常在下一代 比高一点的好

    首次创建对象时,它是 进入第0代。当 第0代已满,垃圾 调用收集器。那些 在垃圾收集中生存 第一代人被提升到 下一代,更高一代。 在垃圾中生存的物体 第1代中的集合是 晋升到下一个和最高级别 第二代,第二代。这 该算法能有效地解决这一问题 对象的垃圾收集 速度很快。请注意,第2代是 最高的一代是 由垃圾收集器支持

    几代人

    当内存分配打开时 托管堆很快,GC本身也很快 可能需要一些时间。考虑到这一点 已经进行了一些优化 提高绩效。GC 支持世代观念,, 基于以下假设: 对象在堆上的时间越长, 它可能停留的时间越长 那里在上分配对象时 它属于第0代的堆。 每个垃圾收集 对象生存时间增加其 1代(目前最高 支持的生成是2)。明显地 搜索速度更快,而且 垃圾收集所有垃圾的子集 对象,因此GC具有 仅收集发电量的选项 0、1或2个对象(或其他 它选择的组合,直到 足够的内存)。即使在 仅收集GC中较年轻的对象 还可以确定旧对象是否具有 引用新对象以确保 它不会无意中忽略 正在使用的对象

    我的博客, ,回答你的问题:

    CLR的垃圾收集器(GC)是一个分代垃圾收集器,也称为季节性垃圾收集器

    它有三代人:

    第0代: 它包含GC从未检查过的所有新构造的对象

    第1代: CLR在初始化时为第0代选择以kb为单位的预算大小。如果对象的创建导致生成0超出其预算,则启动垃圾收集。未在第0代中收集的对象将移动到第1代,第0代将清空。 假设第0代的预算等于5个对象的大小。因此,在创建对象6之前,第0代将如下所示:

    创建对象6后,开始垃圾分配,在第1代中释放垃圾对象1、3和5,并移动彼此相邻的2和4

    CLR在初始化时也会选择第1代的预算大小。对象11的创建导致GC再次启动,这可能会将更多的对象移动到第1代

    在第1代达到垃圾收集的预算大小之前,垃圾收集将忽略它,这将提高GC的性能

    第2代: 在多个第0代收集过程中,第1代可能会超过其预算限制,从而导致GC从两代收集垃圾。在这种情况下,第1代幸存者升级到第2代,第0代幸存者升级到第1代,第0代为空

    假设分配对象21导致垃圾收集和第1代预算已达到。

    因此,堆将如下图所示,第1代中幸存的对象将升级到第2代

    因此,生成GC基本上假设较新的对象更有可能被收集

    我们知道CLR为所有三代选择预算,但它可以修改预算,因为GC是一个自调优收集器。如果GC在收集第0代后发现存活的对象很少,它可能会决定减少第0代的预算,以便完成较少的工作。另一方面,如果GC收集第0代并发现有很多幸存的对象,则在垃圾收集中不会回收很多内存。在这种情况下,垃圾收集器将增加第0代的预算。GC还相应地修改了第1代和第2代的预算

    您写道:“第1代标识一个在GC中幸存的对象(标记为收集,但由于有足够的堆空间而未删除)”-您的意思是:第1代标识一个在GC中幸存的对象(在垃圾收集运行时未删除,因为它仍然有对它的引用)?