【问题标题】:.NET Garbage Collector - Terminal Services.NET 垃圾收集器 - 终端服务
【发布时间】:2009-02-09 23:48:26
【问题描述】:

有吗

  • 一个垃圾收集器用于整个系统
  • 每个登录用户的垃圾收集器实例
  • 为每个正在运行的 .NET 应用程序提供一个垃圾收集器

或者以上都不是(请解释)?

【问题讨论】:

    标签: .net memory-management garbage-collection


    【解决方案1】:

    每个 .NET 进程有一个 GC 线程,因此每个进程有一个堆。但是,这些对象被映射到单独的 AppDomain 以提供进程隔离的好处。虽然一个进程中可以有多个 AppDomain,但默认情况下每个进程只有一个。

    终端服务:

    这意味着对于终端服务环境中应用程序(称为 MyApp.exe)的典型部署,用户正在运行的 .NET 应用程序的不同实例将各自具有独立的堆和活动内存管理。更重要的是,终端服务会话本身代表某种内存边界,因为当用户注销时会卸载会话 (http://msdn.microsoft.com/en-us/library/aa383496(VS.85).aspx)。

    以下说明了如何为每个终端服务会话加载 MyApp.exe,并解释了一些可能影响会话中内存可用性和性能的设置:http://blogs.technet.com/askperf/archive/2007/07/24/sessions-desktops-and-windows-stations.aspx

    深入细节:

    更多详情请参阅 Jon Skeet 的回复:What is the scope of finalizer thread - per application domain or per process?

    深奥的细节:

    此外,以下文章解释了 Microsoft 现在如何允许并行 CLR 实例,以便可以同时运行多个版本的 CLR。这特别适用于 Silverlight:http://msdn.microsoft.com/en-us/magazine/cc721609.aspx

    此外,所有未来版本的 CLR 似乎都将支持此功能:http://blogs.msdn.com/davbr/archive/2008/11/10/new-stuff-in-profiling-api-for-upcoming-clr-4-0.aspx

    【讨论】:

    • 我 99% 确定您是不正确的。每个 CLR 实例有一个 GC 线程,因此每个 CLR 实例都有一个 GC。
    • 我偷偷怀疑我没有正确解释它,所以我做了更多的研究。我还在基地吗?
    • 您仍然有点不正确,因为每个进程可能有多个 CLR 实例。不过,今天这是一个相当遥远的角落案例。但谁知道它将来会流行到什么程度
    • 嗯,您指的是 CLR 4.0,如blogs.msdn.com/davbr/archive/2008/11/10/… 中的“进程内并行 CLR 实例”部分?
    • 请注意,没有什么可以阻止他们改变这一点,事实上,现在一种常见的方法是使用多个 eden (gen 0) 区域,每个线程一个,并允许其中的 GC 内联发生根据需要穿线。仍然有一个世界 GC 线程,但没有强制执行。
    【解决方案2】:

    进程中每个 CLR 实例都有垃圾收集器。 CLR 的多个实例可能在同一个进程中运行,但这种情况非常罕见。一般来说,每个进程有一个 CLR。​​

    【讨论】:

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