0

当我阅读 3 本关于 GC 的书籍时,我注意到一些奇怪的事实:

C# 通过 CLR

CriticalFinalizerObjectCLR 以一种非常特殊的方式对待这个类和从它派生的类

在此处输入图像描述

什么 ???

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

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

帮助 ?

4

3 回答 3

5

JIT 编译器仅在第一次执行时将方法从 IL 编译为本机代码。如您所料,这需要额外的内存。因此,普通的终结器仅在它们被清理线程执行之前被编译。

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

于 2012-04-06T11:26:00.177 回答
2

我认为它是“编译器”的后端。从 IL 到机器码。

于 2012-04-06T10:53:58.737 回答
1

使用编译器是 JIT 编译器,旨在急切地编译您的终结器方法,而不是在执行前不久延迟其编译。

其背后的更深层原因是,在执行所有正常的终结器之后,在应用程序关闭期间会调用这些终结器。但是 CLR 确实执行所有挂起的终结器,超时时间为 2 秒(至少从那时起 .NET 2.0 就没有检查过)。然后执行关键终结器。

关键终结器很少使用,例如在任何情况下都需要关闭的句柄。但是您也可以使用它们来保持资源打开,直到所有终结器都被执行以启用例如跟踪,甚至在终结器内部。

于 2012-04-06T11:21:42.607 回答