为什么GC将对象放在终结队列中?

pas*_*ena 10 .net c# garbage-collection

据我所知,一旦我实现了类的析构函数,c#中的垃圾收集器就会将类的所有对象放入终结队列中.当我阅读GC.Suppresfinalize的文档时,它提到对象头已经设置了一个用于调用finalize的位.

我想知道为什么GC的实现者必须将所有对象放入队列中,并将内存释放延迟1-2个周期.他们不能只是在释放内存时查看位标志,然后调用对象的finalize然后释放内存?

毫无疑问,我是一个白痴,我无法理解GC的工作.我提出这个问题只是为了增进我的理解或填补我所知的缺失空白

编辑:如果位标志用于suppressfinalize,GC实现者可能为此目的在对象头中添加了另一个标志,不是吗?

jas*_*son 12

因此它可以在不同的线程中运行,从而防止阻塞主GC线程.

您可以从此MSDN文章中了解有关GC的大量信息.


Ken*_*kot 4

这里有一个很好的解释

Finalizer Queue 和 Control+ThreadMethodEntry 是什么?

本质上的原因是,GC 必须等待终结器代码执行可能并不总是理想的,因此排队终结器允许将终结推迟到更方便的时候。