2010-03-22 115 views

回答

4

它采用mark and sweep algorithm。简化版本:首先考虑所有对象符合资格收集。然后它扫描物体的根。任何有根的对象都会被标记为正在使用中。之后所有剩余的对象都被认为是垃圾。 Jeffrey Richter在CLR via C#中有详细的描述。

+0

得到了这本书,并阅读它。非常感谢。现在非常清楚。 – devnull 2010-03-23 09:55:56

3

This文章A.亨特解释这一切还不错。

总之,GC以下引用查找所有不可达的对象。如果一个对象或其任何超类包含另一个对象的字段,则该对象引用另一个对象。

为了达到这个目的,GC跟踪四种类型的根对象,称为GC根。最常见的根类型是堆栈上创建的所有变量(如您猜测的那样)。其他根类型是静态的,互操作性的和带有终结器方法的对象。

所以是的,GC在大多数情况下指的是堆栈。

+0

一个较小的更正 - 在堆栈上创建的所有变量都是误导性的,“当前正在运行的方法中的局部变量被认为是GC根,这些变量引用的对象总是可以通过它们声明的方法立即访问因此它们必须被保留,这些根的生命周期可以取决于程序的构建方式,在调试版本中,只要方法在堆栈上,局部变量就会持续。参考。 - http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/ – akjoshi 2012-05-24 06:56:32