GC是否挂起当前/所有进程



Andrew Troelsen在其著作《Pro C#2008和.NET 3.5平台,第四版》中,在解释CLR的newobj指令时说道第248页,倒数第二段

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

如果GC仅挂起当前进程,那么它如何确保所有进程以及当前进程都不能访问堆,并避免对刚刚收集的对象进行任何处理,前提是GC处理整个堆,或者Andrew刚刚为初学者总结了该过程?

这不是问题,每个进程都有自己的虚拟内存空间。因此,它自己的堆。另一个进程无法访问你的堆,Windows在进程之间竖起了一堵墙,以确保一个出错的进程不会破坏另一个的稳定。

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

我们可以回到CLR是按进程托管的事实。那么安德鲁所描述的就更容易理解了。

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

参考文献:

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

CLR通过C#书籍

最新更新