有吗
或者不是上述(请解释)?
答案 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。