分代垃圾收集与.NET中的垃圾收集

时间:2012-03-20 11:33:43

标签: .net garbage-collection

我读到了关于GC的内容,我意识到GC没有一种方法可以工作但只有两种方法?

首先是正常的GC:

  1. 使用应用程序根
  2. 检测垃圾对象
  3. 在可释放的队列中将对象收集到空闲状态
  4. 调用freachable中所有对象的finalize方法 队列
  5. 删除下一轮GC中的所有已完成对象。
  6. 第二个是分代GC:

    1. 扫描对象并检测要释放的对象并将其删除
    2. 将存活的那些传递给第2代(扫描它们更少 倍)
    3. 将存活最多的对象传递给第3代。
    4. 我完全糊涂了: 这两种不同类型的GC?或者代际GC是否像第一个升级?还是一样吗?

      .NET的工作方式是什么?

2 个答案:

答案 0 :(得分:1)

.NET几代就像你描述的那样。 “Something”触发GC传递。这个通行证的幸存者被提升到下一代,直到第二代(从第0代开始,所以共有2次促销)。

GC在几代人中传递得更高,因为它们可能更贵。

这个博客(以及网络上的许多其他来源)很好地概述了.NET中的GC:

http://dotnetfacts.blogspot.co.uk/2008/05/how-garbage-collector-works-part-1.html

http://dotnetfacts.blogspot.co.uk/2008/05/how-garbage-collector-works-part-2.html

你所描述的似乎是.NET故事的两半。我相信你对终结器和内部队列(可释放)的概述大多是准确的(不确定),但生成行为也是如此。

这个SO问题也在类似的水域中趾高气扬:

Garbage Collection in .Net implementaion, objects behavior is unknown, unable to understand their behavior

答案 1 :(得分:1)

在您的课程中实施析构函数/终结器时,您的第一点是适用的。其条目将在初始化其对象时添加到终结队列。当GC Root 不再引用此对象(例如堆栈引用,静态对象引用,CPU寄存器......)除了finalization / fReachable队列(两者都充当GC Root)之后,此条目为移动到fReachable队列。此队列由一个单独的线程监视,该线程负责调用此对象的finalize方法。

以下链接是了解.NET环境下内存管理的最终参考。前两章(大约40页)将为您提供关于垃圾收集如何在.NET环境下工作的出色而深刻的概念。最重要的是免费电子书。

Under the Hood of .NET Memory Management Chris Farrell和Nick Harrison

Direct Link

我向每个想要使用.NET技术编写高效程序的.NET Guy推荐这本书。