.net 垃圾收集器如何确定对象是否为垃圾?

.net 垃圾收集器如何确定对象是否为垃圾?,.net,garbage-collection,.net,Garbage Collection,垃圾收集器如何确定对象是否为垃圾?它是否引用堆栈来检查对堆中分配的空间的引用?我建议您阅读一些有关这方面的文献:并且。它使用了一个。简化版:它首先考虑所有对象都有资格收集。然后它扫描对象的根。然后,任何根对象都被标记为正在使用。接下来,所有剩余的对象都被视为垃圾。杰弗里·里克特(Jeffrey Richter)在书中对细节进行了精彩的描述 亨特的一篇文章很好地解释了这一切 简而言之,GC遵循引用查找所有无法访问的对象。如果一个对象或其任何超类包含另一个对象的字段,则该对象引用另一个对象 为了实现

垃圾收集器如何确定对象是否为垃圾?它是否引用堆栈来检查对堆中分配的空间的引用?

我建议您阅读一些有关这方面的文献:并且。

它使用了一个。简化版:它首先考虑所有对象都有资格收集。然后它扫描对象的根。然后,任何根对象都被标记为正在使用。接下来,所有剩余的对象都被视为垃圾。杰弗里·里克特(Jeffrey Richter)在书中对细节进行了精彩的描述

亨特的一篇文章很好地解释了这一切

简而言之,GC遵循引用查找所有无法访问的对象。如果一个对象或其任何超类包含另一个对象的字段,则该对象引用另一个对象

为了实现这一点,GC跟踪称为GC根的四种类型的根对象。最常见的根类型是在堆栈上创建的所有变量(如您所猜测的)。其他根类型包括静态、互操作相关和带有终结器方法的对象


因此,是的,GC在大多数情况下引用堆栈。

拿到书并阅读。谢谢。现在很清楚了。一个小的修正-在堆栈上创建的所有变量都是误导性的,“当前正在运行的方法中的局部变量被视为GC根。这些变量引用的对象总是可以通过声明它们的方法立即访问,因此必须保留它们。这些根的生命周期可能取决于程序的构建方式。在调试构建中,只要方法在堆栈上,局部变量就会持续-