垃圾收集器是在单独的进程中运行的吗?
垃圾收集器是否在单独的进程中启动?
例如:
-
如果我们尝试测量某些代码所花费的处理时间,并且在此过程中垃圾收集器开始收集,它将在新进程或同一进程中启动吗?
-
它的工作方式如下吗?
//Code (Process 1) --> Garbage Collector Run (Process 1) //Code (Process 1)
或者像这样?
//Code (Process 1) --> Garbage Collector Run (Process 2) //Code (Process 1)
垃圾收集器在同一个进程上运行触发垃圾收集的线程。 它会停止所有当前线程,并自行执行。 它肯定没有启动另一个进程,你会在Windows中看到它。
来自MSDN :
在垃圾收集开始之前,除了触发垃圾收集的线程之外,所有托管线程都将被挂起。
(这仅适用于工作站,正如DrKoch所指出的那样 )。 服务器具有运行垃圾收集的后台线程。
如果您在引用的文档中搜索“并发垃圾收集”,那么您将使用支持此文本的“GC线程”文本。
如果您愿意,可以强制在单独的线程中运行garabage集合。 把它放在你的app.config
:
(从这个答案 )
另请阅读.NET Framework 4.5包括针对客户端和服务器应用程序的新垃圾收集器增强function ,如Adam Houldsworth所建议的,关于自.NET 4.5以来垃圾收集器工作方式的变化。
首先, 进程和线程之间存在区别。 正如@CodesInChaos指出的那样,每个进程都有自己的地址空间,因此在单独的进程中运行GC是没有意义的。
如果我们谈论线程 :“工作站”和“服务器”之间存在差异。 在工作站上,它在其中一个用户线程上运行:
该集合发生在触发垃圾回收的用户线程上
在服务器上,它在单独的专用线程中运行:
该集合发生在以THREAD_PRIORITY_HIGHEST优先级运行的多个专用线程上。
如果您的机器被视为“服务器”取决于配置:
运行时配置架构的
元素
请参阅垃圾收集基础知识