.NET垃圾收集器 - 它的线程优先级是什么?

Eri*_*bal 5 .net garbage-collection

我发现了一些很棒的文章(Maoni,Richter#1,Richter#2)给出了关于GC的理论和实践的许多细节,但我找不到任何说明如何设置GC线程优先级的内容.

我发现的最接近的是这个表明Finalizer线程"以异步方式运行到应用程序并且具有高优先级".

我一直以为它是一个"低优先级"的线程,但是阅读越来越多关于它似乎是错误的(因为GC必须阻止所有其他线程,并且你不希望你的应用程序依赖于一个低优先级的线程,以便及时恢复).

有谁知道确切知道实际的优先级应该是什么?

Tim*_*son 9

CLR中通过C#,Richter解释说:

一个特殊的高优先级CLR线程专用于调用Finalize方法

(参见第20章"最终化内部"标题)

这是他讨论垃圾收集器线程的唯一上下文.在本章的前面,他解释说垃圾收集是为响应以下事件之一而启动的:

  • 第0代已满
  • 拨电至 GC.Collect
  • Windows报告内存不足
  • CLR正在卸载AppDomain
  • CLR正在关闭

...这表明垃圾收集器创建的唯一线程是这个单一的"高优先级"终结器线程.

编辑:然后他继续在"并发收集"中解释:

在运行工作站版本的执行引擎的多处理器系统上,垃圾收集器有一个额外的后台线程,用于在应用程序运行时同时收集对象.[...] 垃圾收集器具有标记无法访问的对象的普通优先级后台线程.

  • 终结器线程维护需要终结的单个对象队列,并按顺序运行终结器。 (2认同)

Ree*_*sey 5

GC线程以正常优先级运行.终结器线程以"最高"优先级运行.

您可以通过打开Debug"Thread"窗口并打开托管应用程序中的任何位置来查看此信息.所有线程都列出(尽管它们没有命名),并列出了它们的优先级.解密哪个是必需的,但是会有一个额外的"Normal"和"Highest"优先级线程,它对应于GC和Finalizer线程.