.NET垃圾收集器线程数

时间:2011-07-28 10:18:04

标签: .net multithreading garbage-collection

在任何给定时间运行了多少次?它是整个框架的一个,还是每个.NET托管进程一个?当物理内存丰富时,假设没有活动的GC线程是否正确?

3 个答案:

答案 0 :(得分:4)

.NET垃圾收集有两种模式,服务器和工作站。对于工作站,每个.NET进程都有一个垃圾收集器线程。如果您正在运行服务器垃圾收集模式,则每个进程和处理器将有一个垃圾收集器线程。因此,如果您在4核CPU上运行作为服务器的.NET进程,则将有4个垃圾收集器线程。

此外,对于.NET 4,存在新的“后台垃圾收集”模式。它将同时收集0代和1代的项目。

即使您有足够的物理内存,也可能会发生垃圾收集。 .NET将在块中为其堆分配内存。一般来说,会出现这样的情况:当需要new内存时,.NET会尝试在其堆上找到一个适合所需内存块的内存块。如果不成功,GC将运行以尝试收集任何不需要的对象。只有当它没有释放足够的内存时,才会从底层操作系统为堆分配新的内存块。

详情请参阅MSDN文章Fundamentals of Garbage Collection

所有这些都说,我非常同意one of the other answers对这个问题的看法: 不要对GC做任何假设。它应该与您的应用程序无关,如何分配和收集内存。

答案 1 :(得分:2)

虽然我不知道GC使用了多少个线程,但是为每个进程实例化了一个新的.NET运行时(框架)实例。每个进程的.NET运行时都独立于另一个进程。因此,每个进程都有一个不同的GC实例(以及线程)。

即使在具有丰富物理内存的环境中,GC也将继续收集和清理内存。虽然我不确定(没有源代码或文档),但GC可能会比在低内存环境中更少地清理对象。

答案 2 :(得分:1)

我认为如果你能解释一下你的要求,回答你想要的东西会很有帮助。理想情况下,您不应对GC做出任何假设。