垃圾收集器没有更多的参考
我一直在阅读关于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