0

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

在下一个垃圾回收周期中总是会调用 finalize() 吗?

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

4

1 回答 1

1

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

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

于 2009-07-19T17:34:28.297 回答