猜猜标题必须为你提供我想知道的足够的想法,但我必须在这里详细说明一下,这样你才能得到确切的想法。
我知道以下Finalize
方法:
我们需要在类中使用~Classname
在C#中创建析构函数。根据C#,Finalize
&析构函数是同义词(我在MSDN上阅读它,我不知道该陈述的最后部分是否正确)。
用于"优雅地释放非托管资源"。
它可以由用户(开发人员)相应地调用,或者当应用程序在内存(托管堆)上运行时,或者在应用程序结束时调用时。
任何具有Finalize
方法的对象都将在运行时添加到终结队列。
以下图片来自MSDN Magazine Article。它显示了Roots,Managed Heap(MH),Finalization Queue(FQ)&可释放队列(F-RQ)。 所有这些过程都在运行时发生。
我的问题如下:
如何将对MH中的对象的引用添加到FQ中? (意思是,它们会自动添加到FQ中,因为它们有Finalize
或GC通过保持跟踪来添加它们。)
GC是否也通过FQ清除引用? (对于使用GC.SuppressFinalization
的对象引用。)
如果MH有足够的内存用于传入的对象,但同时F-RQ中的特殊线程是使用F中存在的引用的Finalize
方法完成的。 -RQ,在那一刻,GC专门为F-RQ运行以回收内存,或者它将同时运行MH和& F-RQ还是会等到MH内存不足?
修改
对于问题3:考虑下面的图像,F-RQ中的所有引用都不可达。
如果上述问题或知识中有任何错误,请随时指出 它出来&对它的解释将非常感激。
答案 0 :(得分:2)
当GC具有终结器时,它会将对象添加到终结器队列。我不明白你之间的区别,因为他们已经完成了#34;和#34; GC添加他们"。 GC添加因为他们有终结器。从程序员的角度来看,它是自动的。
当一个对象调用GC.SuppressFinalize()
时,它被标记为不需要完成。以后没有必要使用GC"运行"删除该对象引用的队列。在处理队列时,它会被忽略。
是。即首先,没有一个" GC" ...存在几种不同的.NET实现。其次,GC足够复杂,其行为无法真实地进行总结。
请注意,所有这些都是实现细节。以下是我们作为C#用户需要知道的内容:
SafeHandle
类管理的非托管资源,我们需要在我们的类中添加一个终结器,并在终结器中释放这些资源。GC.SuppressFinalize()
,以便GC知道不要浪费时间运行我们的终结器。其余的可以随时改变。它可能在学术上很有趣,或者如果您正在寻找自己的GC。但除此之外,它通常不是可操作的信息。
除了您已经引用的文章外,您可能还对以下内容感兴趣:
MSDN Blogs > cbrumme's WebLog > Finalization
Object.Finalize Method – How finalization works
SO: Generational Garbage collection Vs Garbage collection in .NET