垃圾收集器如何跟踪堆栈中的根

时间:2017-02-18 12:50:02

标签: c# garbage-collection

void method () 
{
   Type obj = new Type () ;
}

也许我误解了一些东西,但是当函数返回并且堆栈被解开时,必须从根集中删除'obj'。这种机制如何运作?我已经搜索了here并用谷歌搜索了它,但没有找到任何澄清我的问题。

2 个答案:

答案 0 :(得分:2)

没有“减法”,这会使调用方法完全过于昂贵。这里的主要角色是即时编译器。它不仅将MSIL转换为机器代码,还生成一个表,描述该方法如何使用对象。该表包含使用对象的代码位置的地址以及存储位置。

注意堆栈是如何抽象的,存储对象引用的更常见的地方是处理器寄存器。 GC需要知道用于正确跟踪对象使用的寄存器。如果 将溢出到堆栈,则堆栈帧偏移。

当垃圾收集器开始运行时,它会遍历堆栈,遍历活动方法的堆栈帧。并使用与每个方法关联的表来查找对象引用。具有很大优势的是,当方法完成时,没有什么特别需要做的事情,堆栈框架就不再存在了。该表还使垃圾收集非常有效,即使方法尚未完成执行,也可以收集对象。比如说,你的Main()方法很重要,你不希望你在该方法中使用的任何对象在应用程序的生命周期中泄漏。它使fixed语句非常便宜,表中只有一点说不应该移动对象。

该表的存在是 在托管代码和非托管代码之间的区别。有关this answer中该表的更多信息。

答案 1 :(得分:0)

在此处查看此文章。 http://www.c-sharpcorner.com/uploadfile/riteshratna/garbage-collection-memory-management-in-net/

通过应用程序根目录查看托管堆上的部分。垃圾收集器可以使用此根列表来确定可以收集哪个对象。