【问题标题】:Number of .NET Garbage Collector Threads.NET 垃圾收集器线程数
【发布时间】:2011-10-15 00:03:40
【问题描述】:

其中有多少在任何给定时间运行?它是一个用于整个框架,还是每个 .NET 托管进程一个?当物理内存充裕时,假设没有活跃的 GC 线程是否正确?

【问题讨论】:

  • 完全不相关的实现细节,有人吗?
  • 实际上,当您谈论延迟和吞吐量之间的权衡可能很重要的性能关键应用程序时,这并不是无关紧要的。通常是具有非常严格 SLA 的金融应用程序。

标签: .net multithreading garbage-collection


【解决方案1】:

.NET 垃圾收集有两种模式,服务器和工作站。对于工作站,每个 .NET 进程都有一个垃圾收集器线程。如果您正在运行服务器垃圾收集模式,则每个进程和处理器将有一个垃圾收集器线程。因此,如果您有一个 .NET 进程在 4 核 CPU 上作为服务器运行,那么您将拥有 4 个垃圾收集器线程。

此外,对于 .NET 4,存在一种新的“后台垃圾收集”模式。它将同时收集第 0 代和第 1 代中的项目。

即使您有足够的物理内存,也可能会发生垃圾收集。 .NET 将按块为其堆分配内存。一般来说,会发生这样的事情:当需要new 内存时,.NET 将尝试在它的堆上找到一个适合所需内存块的内存块。如果不成功,GC 将运行以尝试收集任何不需要的对象。只有当这不能释放足够的内存时,才会从底层操作系统为堆分配一个新的内存块。

详细信息在 MSDN 文章中,Fundamentals of Garbage Collection

说了这么多,我非常同意one of the other answers 在这个问题上: 不要对 GC 做任何假设。它应该与您的应用程序如何分配和收集内存无关。

【讨论】:

  • 谢谢。此处对 GC 模式的其他讨论:stackoverflow.com/questions/1707240/…
  • 从上面的链接中,我收集到您的应用程序的默认模式取决于您是否拥有一个或多个 CPU。但它可以通过 App.config 或 Web.config 设置来指定。对吗?
  • 是的,可以在 app.config 中设置(大多数情况下实际上是在 machine.config 中设置)。如果您只有一个 CPU,则无论配置如何,您都将始终以“工作站”GC 模式运行。
  • "此外,对于 .NET 4,存在一种新的“后台垃圾收集”模式。它将同时收集第 0 代和第 1 代中的项目。"这在技术上是不正确的。后台模式是并发 gc 的替代品,仅对 gen2 对象进行操作。 gen0 和 gen1 集合始终在工作站和服务器模式下暂停用户线程。见:msdn.microsoft.com/library/ee787088(v=vs.110).aspx
【解决方案2】:

虽然我不知道 GC 使用了多少线程,但为每个进程实例化了一个新的 .NET 运行时(框架)实例。每个进程的 .NET 运行时独立于另一个。因此,每个进程都有不同的 GC 实例(以及线程)。

即使在可用物理内存充足的环境中,GC 也会继续收集和清理内存。虽然我不确定(没有源代码或文档),但 GC 可能会比在低内存环境中更积极地清理对象。

【讨论】:

    【解决方案3】:

    我认为,如果您能解释您的要求,那么回答您正在寻找的内容会很有帮助。理想情况下,您不应该对 GC 做出任何假设。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      相关资源
      最近更新 更多