【发布时间】:2009-02-09 23:48:26
【问题描述】:
有吗
- 一个垃圾收集器用于整个系统
- 每个登录用户的垃圾收集器实例
- 为每个正在运行的 .NET 应用程序提供一个垃圾收集器
或者以上都不是(请解释)?
【问题讨论】:
标签: .net memory-management garbage-collection
有吗
或者以上都不是(请解释)?
【问题讨论】:
标签: .net memory-management garbage-collection
每个 .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
【讨论】:
进程中每个 CLR 实例都有垃圾收集器。 CLR 的多个实例可能在同一个进程中运行,但这种情况非常罕见。一般来说,每个进程有一个 CLR。
【讨论】: