.NET垃圾收集器

时间:2010-07-01 11:52:35

标签: .net garbage-collection

它写在链接http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

“当应用程序创建一个新对象时,new运算符从堆中分配内存。如果对象的类型包含Finalize方法,则指向该对象的指针将放置在终结队列中。”

有人可以澄清我吗

1)这意味着,只有当我们明确使用finalize(使用析构函数)时,对象才会进入finalize队列。

2)每个.NET类通过隐式使用finalize(使用析构函数)使所有.net类库对象进入finalize队列。

3)我们的自定义类如何   A类    {    }  class A obj将完成或不完成,同时考虑两种情况(显式/隐式析构函数)

4)如果上面的类是用非托管代码编写的,那将会发生什么。它会去最终确定队列

由于

1 个答案:

答案 0 :(得分:3)

1)是的,实现Finalize()方法的对象(C#中的“析构函数”)被添加到finalize-queue中。

2)不,大多数.NET类都没有Finalizer。如果未在类中实现一个,则不会将该类的实例添加到finalize队列中。

3)A类只有在实现Finalize-Method时才会进入finalize-queue。 (C#中的“析构函数”

4)不管理非托管类。不会被垃圾收集,也不会被添加到finalize-queue。

一些一般性说明。

  • C#中的'析构函数'不是C ++意义上的析构函数。当你被称为等等时,你没有受助者。它是用于编写终结者方法的语法糖。
  • 避免使用终结器,因为它们会增加额外的开销。首先,必须将对象添加到finalize队列中。然后它必须被垃圾收集两次。第一次检测到它不再使用了。终结者方法第二次完成。
  • 使用IDisposable接口管理和释放资源。特别是原生资源。
  • 仅使用终结器,用于本地资源的“紧急清理”。基本上你检查对象是否正确处理(IDisposable)-interace。如果没有,您可以在终结器中完成工作,以防止进一步的资源泄漏。