GC是否暂停当前/所有进程?

时间:2012-02-12 11:09:29

标签: .net garbage-collection

Andrew Troelsen 在他的书Pro C# 2008 and the .NET 3.5 Platform, Fourth Edition中说了解CLR newobj指令 248,第二个最后一段

  

垃圾收集器暂时挂起当前进程中的所有活动线程,以确保应用程序在收集过程中不访问堆

如果GC暂停当前进程,那么它如何确保所有进程和当前进程都无法访问堆并避免对刚刚收集的对象进行任何处理,前提是GC处理整个堆或 Andrew 刚刚总结了初学者的流程?

2 个答案:

答案 0 :(得分:3)

这不是问题,每个进程都有自己的虚拟内存空间。因此它自己的堆。另一个进程无法访问您的堆,Windows在进程之间设置了一道大墙,以确保一个错误进程不会破坏另一个错误。

进程执行共享内存,但仅限于代码,而不是数据。在RAM中只有一个ngen-ed框架代码,CLR和抖动的副本,由执行托管代码的所有进程共享。与问题无关,内存不会被垃圾收集。

答案 1 :(得分:1)

我们可以回到每个进程托管CLR的事实。然后安德鲁描述的内容更容易理解。

垃圾收集器只需要在承载此CLR副本的进程中挂起活动线程(托管),然后开始收集。它永远不需要跳到另一个进程。

参考文献:

http://technet.microsoft.com/en-us/query/678ysw69

CLR通过C#book