【问题标题】:Is the garbage collector in .net system-wide or application-wide?.net 系统范围内的垃圾收集器还是应用程序范围内的垃圾收集器?
【发布时间】:2011-10-22 09:11:34
【问题描述】:

在与我的同事讨论期间,我怀疑 .net 中的垃圾收集器在系统范围或应用程序范围内工作。

意味着如果每个应用程序都有自己的 GC,那么它会影响系统性能吗?

我对此有点困惑。

【问题讨论】:

  • 就像任何本地进程一样,它们也有自己的虚拟内存块。 Windows 3.11 是最后一个不阻止应用程序相互破坏的 Windows 版本。它崩溃了很多。

标签: c# .net garbage-collection


【解决方案1】:

每个进程都有自己的托管堆,将单独收集。

没有系统范围的堆,所以不可能有系统范围的 GC。

(如果您在同一个进程中运行多个 CLR,它们每个都有自己的 GC。不过这种情况非常罕见。)

【讨论】:

  • 我标记为正确答案。请澄清一下,这不会影响整体系统性能吗?
  • @Syed:您还没有将任何内容标记为正确答案。但是不清楚你所说的“它不会影响整体系统性能”是什么意思 - GC正在工作,所以如果你有很多进程每个都通过执行GC来消耗资源,那么这显然会影响整体系统性能,和其他任何东西一样。
  • 我认为 GC 在决定多久进行一次收集时确实会考虑系统范围内的可用内存。
  • @Jon Skeet:谢谢,我无法标记为正确答案。它让我等十分钟。
  • 再澄清一下,进程是管理可执行文件包含的整体 Win32 结构,但是许多 .NET 应用程序可能在各自的 AppDomain 中的进程内运行(将它们视为较小的进程专门用于 .NET 应用程序)。你可以阅读更多关于 AppDomains here
【解决方案2】:

在 .Net 运行时的 Workstation\Server 版本中,每个进程都有一个垃圾收集器。 GC 为每个托管进程引入了 CPU 开销。

这是否会影响系统性能取决于您拥有多少托管进程以及它们是否花费大量时间来收集垃圾。您可以通过检查性能计数器“% Time Spent In GC”来分析您的进程在收集垃圾上花费了多少时间。

【讨论】:

    【解决方案3】:

    每个应用程序都有自己的堆和 .NET 运行时实例,因此它也有自己的垃圾收集器线程。

    【讨论】:

      【解决方案4】:

      查看此页面 (http://msdn.microsoft.com/en-us/library/ee787088.aspx),尤其是在托管堆部分下。这应该可以回答您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多