垃圾回收器如何确定一个对象是否是垃圾?

3
垃圾收集器如何确定一个对象是否为垃圾?它是否参考栈来检查对堆空间分配的引用?
3个回答

4
它采用了一种标记清除算法。简化版如下:首先将所有对象视为可收集的,然后扫描对象的根。任何有根的对象都被标记为正在使用中。接着,所有剩余的对象都被视为垃圾。Jeffrey Richter在CLR via C#中对细节进行了出色的描述。

拿到了这本书并阅读了。非常感谢。现在很清楚了。 - softwarematter

3
这篇由A. Hunter撰写的文章(链接)讲解了所有相关内容。
简而言之,GC跟随引用来查找所有不可达对象。如果一个对象或其任何超类包含另一个对象的字段,则该对象引用另一个对象。
为了实现这一点,GC跟踪四种类型的根对象,称为GC根。最常见的根类型是在堆栈上创建的所有变量(正如您所猜测的那样)。其他根类型包括静态变量、Interop相关变量和带有终结器方法的对象。
因此,在大多数情况下,GC会引用堆栈。

一个小修正 - 所有在堆栈上创建的变量是误导性的,“当前正在运行的方法中的本地变量被认为是GC根。这些变量引用的对象可以立即由声明它们的方法访问,因此必须保留它们。这些根的生命周期取决于程序构建的方式。在调试构建中,局部变量的持续时间与方法在堆栈上的时间一样长。” 参考 - http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/ - akjoshi

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接