包含FINALIZE方法的对象?

时间:2014-11-12 08:39:42

标签: c# garbage-collection clr finalize

猜猜标题必须为你提供我想知道的足够的想法,但我必须在这里详细说明一下,这样你才能得到确切的想法。

我知道以下Finalize方法:

  1. 我们需要在类中使用~Classname在C#中创建析构函数。根据C#,Finalize&析构函数是同义词(我在MSDN上阅读它,我不知道该陈述的最后部分是否正确)。

  2. 用于"优雅地释放非托管资源"。

  3. 它可以由用户(开发人员)相应地调用,或者当应用程序在内存(托管堆)上运行时,或者在应用程序结束时调用时。

  4. 任何具有Finalize方法的对象都将在运行时添加到终结队列

  5. 以下图片来自MSDN Magazine Article。它显示了Roots,Managed Heap(MH),Finalization Queue(FQ)&可释放队列(F-RQ)。 所有这些过程都在运行时发生。

    IMAGE 1


    我的问题如下:

    1. 如何将对MH中的对象的引用添加到FQ中? (意思是,它们会自动添加到FQ中,因为它们有Finalize或GC通过保持跟踪来添加它们。)

    2. GC是否也通过FQ清除引用? (对于使用GC.SuppressFinalization的对象引用。)

    3. 如果MH有足够的内存用于传入的对象,但同时F-RQ中的特殊线程是使用F中存在的引用的Finalize方法完成的。 -RQ,在那一刻,GC专门为F-RQ运行以回收内存,或者它将同时运行MH和& F-RQ还是会等到MH内存不足?

    4. 修改

      对于问题3:考虑下面的图像,F-RQ中的所有引用都不可达。

      IMAGE2

      如果上述问题或知识中有任何错误,请随时指出 它出来&对它的解释将非常感激。

1 个答案:

答案 0 :(得分:2)

  1. 当GC具有终结器时,它会将对象添加到终结器队列。我不明白你之间的区别,因为他们已经完成了#34;和#34; GC添加他们"。 GC添加因为他们有终结器。从程序员的角度来看,它是自动的。

  2. 当一个对象调用GC.SuppressFinalize()时,它被标记为不需要完成。以后没有必要使用GC"运行"删除该对象引用的队列。在处理队列时,它会被忽略。

  3. 是。即首先,没有一个" GC" ...存在几种不同的.NET实现。其次,GC足够复杂,其行为无法真实地进行总结。

  4. 请注意,所有这些都是实现细节。以下是我们作为C#用户需要知道的内容:

    • 如果我们使用无法通过SafeHandle类管理的非托管资源,我们需要在我们的类中添加一个终结器,并在终结器中释放这些资源。
    • 我们还需要在这种情况下实现IDisposable(以及其他),并在我们的实现中调用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