当GC在用户线程中启动时,真正发生了什么?

时间:2012-07-15 00:28:14

标签: .net .net-4.0 garbage-collection

我在这里看到了这些图:http://msdn.microsoft.com/en-us/library/ee787088.aspx 好几年,我以为我理解了它们。然而,当我试图想象线程中发生了什么事实上我无法实现..

让我们说 - 当GC不在专用线程上运行但在触发GC的线程中运行时。

查看名为“垃圾收集过程中会发生什么”的部分。

请参阅红色箭头 - 这应该是在用户线程上运行的GC。

因此,假设我有一个在线程中运行的worker方法,并且该worker运行循环。然后在GC kciks的某个时间点......

我的问题是 - 我的线程在GC开始然后结束时究竟会发生什么。

  • 是否会进行上下文切换?
  • 是否会分配新的线程上下文并加载新的堆栈以供GC运行?
  • GC代码在其他人的帖子中执行的准确程度(最令我费解的)... 线程已分配堆栈并且代码已加载.. GC代码如何 被处决 - 我甚至无法想象这件作品。

1 个答案:

答案 0 :(得分:1)

GC如何在其他人的线程上执行?它没有,因为“你的”线程并不是你的线程;他们是CLR的主题!

CLR可以使用你的线程堆栈,更不用说线程的代码了,它允许它做一些名为thread hijacking的事情。基本上,它修改了调用堆栈上的返回指针,这样,一旦当前方法返回,您的代码将转移到允许垃圾收集器运行的特殊函数中。 GC完成后,程序可以返回到用户代码中的适当位置,并且一切正常。