我发现了一些很棒的文章(Maoni, 里克特 #1, 里氏#2)给出了关于 GC 的理论和实践的许多细节,但我找不到任何说明 GC 的线程优先级是如何设置的。
我发现的最接近的是这个,它指出 Finalizer 线程“以高优先级与应用程序异步运行。”
我一直认为这是一个“低优先级”线程,但是阅读越来越多的关于它的信息似乎是错误的(因为 GC 必须阻止所有其他线程,并且您不希望您的应用程序依赖于低优先级线程以便及时恢复)。
有人确切知道实际的优先级应该是什么吗?
In 通过 C# 进行 CLR,里克特解释说:
一个特殊的高优先级 CLR 线程专门用于调用Finalize
methods
(参见第 20 章的“最终确定内部结构”标题)
这是他谈论垃圾收集器线程的唯一上下文。在本章前面,他解释了垃圾收集是为了响应以下事件之一而启动的:
- 0代已满
- Call to
GC.Collect
- Windows 报告内存不足的情况
- CLR 正在卸载 AppDomain
- CLR 正在关闭
...这表明垃圾收集器创建的唯一线程是这个单一的“高优先级”终结器线程。
Edit:然后,他在“并发收藏”中继续解释说:
在运行工作站版本执行引擎的多处理器系统上,垃圾收集器有一个额外的后台线程,用于在应用程序运行时同时收集对象。 [...]垃圾收集器有一个正常优先级的后台线程来标记无法访问的对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)