【发布时间】:2015-01-09 01:04:03
【问题描述】:
猜想标题已经为您提供了我想知道的足够的想法,但我必须在这里稍微详细说明一下,以便您了解确切的想法。
我对@987654324@方法的了解如下:
我们需要在 C# 中使用类中的
~Classname创建一个析构函数。根据C#,Finalize&析构函数是同义词(我在MSDN上看过,不知道最后那部分说法对不对)。用于“优雅地释放非托管资源”。
它可以由用户(开发人员)相应地调用,或者当应用程序内存不足时(托管堆)或在应用程序结束时调用。
任何具有
Finalize方法的对象都将在运行时添加到终结队列。
下图取自MSDN Magazine Article。它显示了根、托管堆 (MH)、终结队列 (FQ) 和可访问队列 (F-RQ)。 所有这些过程都发生在运行时。
我的问题如下:
如何将 MH 中存在的对象的引用添加到 FQ? (意思是,他们是因为有
Finalize而自动添加到FQ,还是GC通过跟踪来添加它们。)GC 是否也通过 FQ 来清除引用? (对于使用
GC.SuppressFinalization的对象引用。)如果 MH 有足够的内存用于传入对象一段时间,但同时 F-RQ 中的特殊线程使用 F-RQ 中存在的引用的
Finalize方法完成那么,此时 GC 是专门为 F-RQ 运行以回收内存,还是为 MH 和 F-RQ 运行,还是等到 MH 内存不足?
编辑:
对于问题 3:考虑下图,其中 F-RQ 中的所有引用都无法访问。
如果上述问题或知识有任何错误,欢迎指出 非常感谢它的解释和解释。
【问题讨论】:
标签: c# garbage-collection clr finalize