首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么GC会将对象放在finalization队列中?

为什么GC会将对象放在finalization队列中?
EN

Stack Overflow用户
提问于 2011-04-12 07:42:56
回答 5查看 6.9K关注 0票数 10

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

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

毫无疑问,我是一个笨蛋,我不能理解GC的工作原理。我提出这个问题只是为了提高我的理解或填补我知识中缺失的空白。

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

EN

回答 5

Stack Overflow用户

发布于 2011-04-12 07:50:02

因此,它可以在不同的线程中运行,从而避免阻塞主GC线程。

你可以从这个MSDN article中学到很多关于GC的知识。

票数 12
EN

Stack Overflow用户

发布于 2011-04-12 07:46:02

这里有一个很好的解释

What are the Finalizer Queue and Control+ThreadMethodEntry?

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

票数 4
EN

Stack Overflow用户

发布于 2011-04-12 07:50:43

垃圾收集暂停越短越好。为此,运行终结器通常被推迟到稍后的时间,当疯狂的垃圾收集工作完成时。相反,它是在后台的单独线程上完成的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5628827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档