.NET垃圾收集器 - 终端服务

时间:2009-02-09 23:48:26

标签: .net memory-management garbage-collection

有吗

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

或者不是上述(请解释)?

2 个答案:

答案 0 :(得分:6)

每个.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

答案 1 :(得分:3)

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