代码之家  ›  专栏  ›  技术社区  ›  Erich Mirabal

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

  •  5
  • Erich Mirabal  · 技术社区  · 15 年前

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

    我找到的最接近的是这个声明终结器线程 "runs asynchronously to the application and at a high priority."

    我一直认为这是一个“低优先级”的线程,但越来越多的阅读似乎是错误的(因为GC必须阻塞所有其他线程,而您不想让您的应用程序依赖于低优先级的线程才能及时恢复)。

    有人知道实际的优先权是什么吗?

    5 回复  |  直到 12 年前
        1
  •  9
  •   Tim Robinson    15 年前

    通过C语言实现CLR Richter解释说:

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

    (见第20章的“最终确定内部结构”标题)

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

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

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

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

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

        2
  •  5
  •   Reed Copsey    15 年前

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

    您可以通过打开调试“线程”窗口,并在托管应用程序的任何位置中断来看到这一点。这些线程都列出了它们的优先级(尽管它们没有命名)。需要一点时间才能破译出哪个线程,但是会有一个额外的“正常”和“最高”优先级线程,它对应于GC和终结器线程。

        3
  •  1
  •   Dave Black    12 年前

    GC运行所依赖的线程取决于应用程序使用的GC版本。

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

        4
  •  0
  •   liana    15 年前

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

        5
  •  0
  •   mfawzymkh    15 年前

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