我读到了关于GC的内容,我意识到GC没有一种方法可以工作但只有两种方法?
首先是正常的GC:
第二个是分代GC:
我完全糊涂了: 这两种不同类型的GC?或者代际GC是否像第一个升级?还是一样吗?
.NET的工作方式是什么?
答案 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问题也在类似的水域中趾高气扬:
答案 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
我向每个想要使用.NET技术编写高效程序的.NET Guy推荐这本书。