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

时间:2009-05-06 17:44:11

标签: .net garbage-collection

我发现了一些很棒的文章(MaoniRichter #1Richter #2)提供了有关GC的理论和实践的许多细节,但我找不到任何说明如何GC的线程优先级已设置。

我发现的最接近的是说明终结者线程"runs asynchronously to the application and at a high priority."

我一直认为它是一个“低优先级”的线程,但是阅读越来越多关于它似乎是错误的(因为GC必须阻止你所有的其他线程,你不想拥有你的app取决于低优先级的线程,以便及时恢复。)

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

5 个答案:

答案 0 :(得分:9)

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

  

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

(参见第20章“终结内幕”标题)

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

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

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

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

  

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

答案 1 :(得分:5)

GC线程以正常优先级运行。终结器线程以“最高”优先级运行。

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

答案 2 :(得分:1)

运行GC的线程取决于您的应用使用的GC版本。

这个问题的答案包含在我撰写的博文中: How to determine which garbage collector is running

答案 3 :(得分:0)

垃圾收集器的运行优先级低于关键线程

答案 4 :(得分:0)

GC线程优先级是一个实现细节,现在它们以正常优先级运行,但终结器线程作为高优先级运行并且也有超时。