最终确定可到达表

时间:2009-07-19 17:30:39

标签: clr destructor finalize

如果我在类Foo中实现析构函数,则会在终结队列中密切跟踪Foo的实例。当一个Foo实例被垃圾收集时,我理解CLR会看到终结队列中的条目,并通过将对象从堆中移出并进入终结可达表来为该对象提供特殊处理。然后......垃圾收集周期没有其他事情发生?

在下一个垃圾收集周期中是否会始终调用finalize()?

为什么在将对象复制到可释放表后不立即调用finalize? (这似乎是额外的不必要的复杂性)

1 个答案:

答案 0 :(得分:1)

终结队列是为了简化事情;没有它会更复杂。当GC运行时,不必执行托管代码 - 否则,如果用户代码在中间运行,那么GC所做的所有分析都可能无效。

因此,当GC运行时,必须推迟完成,而不是立即执行。在单独的线程中运行它可以最大限度地减少VM需要对所有线程进行独占访问的时间,并增加并发活动的可能性。

相关问题