垃圾收集器没有更多的参考

我一直在阅读关于C#中的GC,我发现一些陈述很有趣,是真实的。

假设我有以下方法:

public void Foo()
{
   Animal eAnimal = new Animal();
   eAnimal.Name = "Matthew";

   GC.Collect();

   ...more code not using eAnimal...

   return;
}

假设在GC.Collect()语句中,GC指出代码中不再引用与新的Animal()对象相对应的内存地址,因此适用于处理。

据我所知,即使在GC.Collect()语句中,也有对堆栈中新的Animal()的引用(甚至可能存储在某个CPU注册表中)。 我知道,如果我检查代码,尽管该值存在于堆栈中,但代码的逻辑不再使用,但是这种分析我认为可以在编译时完成,而不是在运行时完成。

GC如何知道即使堆栈中有引用,堆栈中的引用也不会以任何方式用于该程序的未来声明中。

我最好的猜测是编译将此考虑在内,并创建适当的指令来清除堆栈中的引用,然后使GC作业更加容易。 但是这似乎给生成的代码增加了很多开销。

编辑:我正在读一本关于考试70-483的书,它说:

StreamWriter stream = File.CreateText(“temp.dat”);
stream.Write(“some data”);
GC.Collect()

在Release模式下运行这段代码时,垃圾收集器将看到没有更多的流引用,它将释放与Stream-Writer实例关联的任何内存。


您没有从方法中返回对该对象的引用,因此当您调用GC.Collect() ,它会查看对象的使用位置,并看到在收集调用后没有其他引用会引用该对象。 如您所示,调用之后的代码都不使用该对象,因此GC将安全地处理它。

MSDN示例在解释与您拥有的类似情况方面做得很好。

垃圾收集操作的全面说明:http://msdn.microsoft.com/zh-cn/magazine/bb985010.aspx

链接地址: http://www.djcxy.com/p/79101.html

上一篇: Garbage Collector no more references

下一篇: How does the GC update references after compaction occurs