Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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
C# 为什么垃圾收集器只有3代,而不是更多或更少?_C#_.net - Fatal编程技术网

C# 为什么垃圾收集器只有3代,而不是更多或更少?

C# 为什么垃圾收集器只有3代,而不是更多或更少?,c#,.net,C#,.net,正如我所经历的垃圾收集(GC)及其生成(0,1,2)。 我突然想到一个问题,为什么微软决定将其限制在3 为什么不能小于3或大于3?我需要一些合乎逻辑的解释。引用文档 堆被组织成几代,因此它可以处理 长寿命和短命对象。垃圾收集主要是 在回收通常为 只占堆的一小部分。有三代人 堆上的对象: 第0代。 这是最年轻的一代,包含了短暂的 物体。短期对象的一个示例是临时变量。 垃圾收集在这一代中发生得最频繁 新分配的对象形成新一代的对象,并且 在中隐式生成0集合,除非它们是大型对象 在这种情况下,它们会在

正如我所经历的垃圾收集(GC)及其生成(0,1,2)。 我突然想到一个问题,为什么微软决定将其限制在3


为什么不能小于3或大于3?我需要一些合乎逻辑的解释。

引用文档

堆被组织成几代,因此它可以处理 长寿命和短命对象。垃圾收集主要是 在回收通常为 只占堆的一小部分。有三代人 堆上的对象:

第0代。

这是最年轻的一代,包含了短暂的 物体。短期对象的一个示例是临时变量。 垃圾收集在这一代中发生得最频繁

新分配的对象形成新一代的对象,并且 在中隐式生成0集合,除非它们是大型对象 在这种情况下,它们会在第2代中进入大型对象堆 收藏

在第0代和第2代中,大多数对象被回收用于垃圾收集 不要活到下一代

第一代。

此生成包含短期对象和服务 作为短期对象和长期对象之间的缓冲区

第二代。

此生成包含长寿命对象。一个例子 长寿命对象的名称是服务器应用程序中 包含进程期间处于活动状态的静态数据

垃圾收集在特定的代上作为条件发生 保证收集一个生成意味着收集该生成中的对象 一代人及其所有年轻一代。第二代垃圾 收集也称为完全垃圾收集,因为它 回收所有代中的所有对象(即 托管堆)

我们可以看到,第2代适用于在整个过程中应该持续的对象。对比进程寿命更长的对象建模是不明智的,至少在我所知道的操作系统上是这样

我怀疑没有更大的代际粒度,因为事实证明,代际粒度比代际粒度带来的好处更麻烦。对这个概念的任何推断都是纯粹的猜测,没有实际的性能测试


我怀疑,即使是来自GC设计者的规范答案也容易引起猜测,但他们可能能够详细说明粒度级别是如何计算的。

因为这就是它的设计方式。即使我们从微软的某个实施GC的人那里得到了答案,答案仍然可能是“主要基于观点”。就我所记得的而言,“一代人”这个词还是有误导性的。关于一代人的含义:。至于为什么MS会选择三代:问问设计itTry的人,让他们从功能的角度来思考:我们有短生命物体(第0代)、中期生命物体(第1代)和无限老化的物品(第2代)。这种设计的目的是在垃圾收集方面有很好的效率,平衡其性能影响和释放(和碎片整理)内存分配的需要。这就像是在问,我需要一个逻辑论点来解释我的同事为什么要走某条路线,他为什么不在那里右转或在这里左转,他为什么不乘公共汽车、出租车或火车?首先,这没关系,除非他不能按时上班,这取决于他们怎么做。第二,他们显然选择了能够让他们快速到达目的地的路线,而不需要付出太多的努力。第三,唯一能理智回答的人是同事。