垃圾收集器是在单独的进程中运行的吗?

时间:2015-03-23 10:46:11

标签: c# .net garbage-collection

垃圾收集器是否在单独的进程中启动?

例如:

  1. 如果我们尝试测量一些代码所花费的处理时间,并且在此过程中垃圾收集器开始收集,它会在新进程或同一进程中启动吗?

  2. 它的工作方式如下吗?

    //Code (Process 1)
    --> Garbage Collector Run (Process 1)
    //Code (Process 1)
    

    或者喜欢这个?

    //Code (Process 1)
    --> Garbage Collector Run (Process 2)
    //Code (Process 1)
    

2 个答案:

答案 0 :(得分:29)

垃圾收集器在同一个进程上运行触发垃圾收集的线程。它会停止所有当前线程,并自行执行。它确实没有启动另一个进程,你会在Windows中看到它。

来自MSDN

  

在垃圾收集开始之前,除了触发垃圾收集的线程外,所有托管线程都被挂起。

(这仅适用于工作站,如DrKoch所指出的那样)。服务器有一个运行垃圾收集的后台线程。

如果您在引用的文档中搜索"并发垃圾收集",您将获得文本" GC线程",它支持此。

如果您愿意,可以强制在单独的线程中运行garabage集合。将其放入app.config

<configuration>
   <runtime>
      <gcServer enabled="true"/>
   </runtime>
</configuration>

(来自this answer

同样阅读The .NET Framework 4.5 includes new garbage collector enhancements for client and server apps,如Adam Houldsworth所示,关于自.NET 4.5以来垃圾收集器工作方式的变化。

答案 1 :(得分:8)

首先,流程线程之间存在区别。 正如@CodesInChaos指出的那样,每个进程都有自己的地址空间,因此在单独的进程中运行GC是没有意义的。

如果我们谈论线程: &#34;工作站&#34;之间存在差异。和&#34;服务器&#34;。在工作站上,它在其中一个用户线程上运行:

  

集合发生在触发垃圾收集的用户线程上

在服务器上,它在单独的专用线程中运行:

  

集合发生在多个专用线程上,这些线程以THREAD_PRIORITY_HIGHEST优先级运行。

如果您的机器被视为&#34;服务器&#34;取决于配置:

  

&LT; gcServer&GT;运行时配置架构的元素

请参阅Fundamentals of Garbage Collection