我发现了一些很棒的文章(Maoni,Richter #1,Richter #2)提供了有关GC的理论和实践的许多细节,但我找不到任何说明如何GC的线程优先级已设置。
我发现的最接近的是说明终结者线程"runs asynchronously to the application and at a high priority."
我一直认为它是一个“低优先级”的线程,但是阅读越来越多关于它似乎是错误的(因为GC必须阻止你所有的其他线程,你不想拥有你的app取决于低优先级的线程,以便及时恢复。)
有人确切知道应该知道实际优先级是什么吗?
答案 0 :(得分:9)
在 CLR中通过C#,Richter解释说:
一个特殊的高优先级CLR线程专门用于调用
Finalize
方法
(参见第20章“终结内幕”标题)
这是他讨论垃圾收集器线程的唯一上下文。在本章的前面,他解释说垃圾收集是为响应以下事件之一而启动的:
GC.Collect
...这表明垃圾收集器创建的唯一线程就是这个单一的“高优先级”终结器线程。
编辑:然后,他继续在“并发收集”中解释:
在运行工作站版本的执行引擎的多处理器系统上,垃圾收集器有一个额外的后台线程,用于在应用程序运行时同时收集对象。 [...] 垃圾收集器具有标记无法访问的对象的普通优先级后台线程。
答案 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线程优先级是一个实现细节,现在它们以正常优先级运行,但终结器线程作为高优先级运行并且也有超时。