我是一位非常有经验的.Net开发人员,对C#和.Net的“全部”进出有深入的了解。但是有一个问题困扰了我很长一段时间关于垃圾收集器。
当然,我知道关于.Net垃圾收集器如何工作的所有“常规内容”。我知道几代人,以及它如何决定它可以释放哪些物品。我知道在释放未使用的物体后,它会压缩剩下的相邻物体。但我不明白的是它如何以有效的方式更新对其移动的对象的引用?
我的意思是,它可以再次遍历整个对象图以找到需要修复的引用,并修复它们。但它需要为它移动的每个对象执行此操作,并且在此过程中,不能安全地访问这些对象。
起初我认为引用不是真正的指针,而是仅指向指向真实对象的指针数组。这样,移动对象只涉及更新表中的唯一指针而不是所有引用。但是,调试一些反汇编我不会发现这就是发生的事情。我还记得我曾经意识到这个假设解决方案存在严重缺陷,但我不记得它是什么......
有没有人(Jon Skeet?:-))可以解释这个问题?
谢谢!