1

我在这里看到了这些图表:http: //msdn.microsoft.com/en-us/library/ee787088.aspx 好几年了,我以为我理解了它们。但是当我试图想象发生了什么时线程实际上我不能..

可以说 - 当 GC 不是在专用线程上而是在触发 GC 的线程上运行时。

查看名为“垃圾收集期间发生的情况”的部分。

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

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

我的问题是——当 GC 开始然后结束时,我的线程到底会发生什么。

  • 会有上下文切换吗?
  • 是否会分配新的线程上下文并加载新的堆栈以供 GC 运行?
  • GC 代码究竟是如何在别人的线程中执行的(对我来说最令人费解)......线程分配了堆栈并加载了代码.. GC 代码是如何执行的 - 我什至无法想象这件作品。
4

1 回答 1

1

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

CLR 可以处理你的线程堆栈,更不用说你的线程代码,它允许它做一些叫做thread hijacking. 基本上,它会修改调用堆栈上的返回指针,这样,一旦当前方法返回,您的代码就会被转移到一个允许垃圾收集器运行的特殊函数中。一旦 GC 完成,程序就可以返回到您的用户代码中的适当位置,一切照常进行。

于 2012-07-15T03:50:19.587 回答