C#在运行时编译finalize方法?

Roy*_*mir 0 .net c# clr .net-4.0

正如我在阅读有关GC的3本书时,我注意到一些奇怪的事实:

C#通过CLR

CriticalFinalizerObject:CLR以非常特殊的方式处理此类和从中派生的类

在此输入图像描述

什么 ???

"没有找到足够的内存来编译方法? "恕我直言 - 代码应该已经编译了......不是吗?

当我编写c#代码时 - 整个代码在运行之前被编译为IL ...不是吗?但根据文本 - 在RUNTIME - 他可能发现编译的内存不足 ......

救命 ?

the*_*oop 5

JIT编译器仅在第一次执行时在运行时编译从IL到本机代码的方法.正如您所料,这需要额外的内存.因此,正常的终结器仅在清理线程执行之前编译.

从派生的对象CriticalFinalizerObject立即编译它的终结器,因此在程序关闭时不需要额外的内存来执行它.这适用于必须尽可能执行终结器的对象(尽管有停电或类似情况)

  • 在appdomain关闭期间,终结器会在执行关键终结器之后超时(它曾经是2秒).SafeHandles从CriticalFinalizerObject派生的全部原因是即使在行为不当的终结器阻止关闭的情况下也要确保关闭句柄. (2认同)