【问题标题】:.NET Garbage Collector - what is its thread priority?.NET 垃圾收集器 - 它的线程优先级是什么?
【发布时间】:2012-09-12 21:50:54
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: .net garbage-collection


    【解决方案1】:

    CLR via C#中,Richter 解释说:

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

    (参见第 20 章的“Finalization Internals”标题)

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

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

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

    编辑:他接着在“并发集合”中解释说:

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

    【讨论】:

    • 这似乎与我可能得到的完整答案一样接近。我会让它打开一段时间,但我认为这可能会做到这一点。谢谢!每天都学点新东西,嗯?也许我应该买他的书。
    • 我绝对可以推荐他的书——它的背景信息很有趣,并且帮我解决了一些具体问题。
    • 我认为这是我在网上找不到答案的罕见情况之一,但一本书似乎有完整的答案。谢谢!
    • 这是否意味着 Finalizer 线程为他调用的每个 Finalize 方法生成一个新线程,还是他自己运行 Finalize 方法?或者也许他使用了一个线程池(ThreadPool?)。
    • 终结器线程维护一个需要终结器的对象队列,并按顺序运行终结器。
    【解决方案2】:

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

    您可以通过打开“调试”“线程”窗口并中断托管应用程序中的任何位置来看到这一点。线程都被列出(尽管它们没有被命名),以及它们的优先级。哪个是哪个需要一点破译,但是会有一个额外的“Normal”和“Highest”优先级线程,分别对应GC和Finalizer线程。

    【讨论】:

    • 这似乎是有道理的(GC正常,终结器最高,以便在不被抢占的情况下返回)。我只是想知道为什么 MSDN 上的任何地方都没有明确解释这一点。除了启动 Thread 窗口之外,您还能找到更“正式”的东西吗?
    • 我不知道任何具体的事情。不久前,我在 Rico Mariani 的一次关于性能的会议演讲中了解到了其中的一些内容。在 .NET 中 - 然而,大多数 MSDN 文档基本上都说忽略 GC 内部并只信任它们 - 也不依赖它们保持不变,因为它们可以随时更改(并且在过去)。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-15
          • 1970-01-01
          • 2020-10-21
          • 1970-01-01
          • 2011-03-18
          • 1970-01-01
          相关资源
          最近更新 更多