当.NET中固定对象使用的内存超过临时段的大小时会发生什么情况?

当.NET中固定对象使用的内存超过临时段的大小时会发生什么情况?,.net,memory,garbage-collection,.net,Memory,Garbage Collection,从这里找到的问题: 似乎将对象固定在内存中(通过fixed关键字?我对对象固定的用法不太熟悉,也不知道是否有多个方法可以按链接问题所述的方式进行固定)会阻止它跨垃圾收集代升级,那么,如果固定对象的总内存消耗实际上超过了短暂的段大小,会发生什么呢 我的提问主要是出于学术好奇心。在我的搜索中,我找不到关于这个场景的任何信息,虽然我当然可以亲自测试,但我想在我投入可能会有点耗时的实验/调查之前,检查是否有人已经知道 编辑:在一些重读之后,我怀疑GC的行为可能是总是在对象周围移动哪个段被认为是哪个生成

从这里找到的问题:

似乎将对象固定在内存中(通过fixed关键字?我对对象固定的用法不太熟悉,也不知道是否有多个方法可以按链接问题所述的方式进行固定)会阻止它跨垃圾收集代升级,那么,如果固定对象的总内存消耗实际上超过了短暂的段大小,会发生什么呢

我的提问主要是出于学术好奇心。在我的搜索中,我找不到关于这个场景的任何信息,虽然我当然可以亲自测试,但我想在我投入可能会有点耗时的实验/调查之前,检查是否有人已经知道

编辑:在一些重读之后,我怀疑GC的行为可能是总是在对象周围移动哪个段被认为是哪个生成,唯一的事情是通过在压缩步骤中固定来防止的。不幸的是,在这一点上,我可以找到的文档(如here:等)仍然有些不清楚


假设GC总是执行一次洗牌,其中一部分内存被视为一个生成,并且对象的唯一移动是压缩步骤,那么固定对象总是在超出短暂段之前在gen 2中结束。在这种情况下,根据评论,我的问题是完全无效的

发布的答案表明,固定不会阻止对象升级。所以这个问题的前提是无效的。“促销”背后的魔力比大多数.NET程序员想象的要小得多。很容易在心里将其建模为从堆的一个部分到另一个部分的相关副本。根本不是这样,它只是更改了一个“this is the gen#0 heap segment”指针。或第1代。要固定整个短暂的段是非常困难的,大型对象堆非常有帮助。“GC并不糟糕。@HansPassant澄清一下,我想知道GC是否表现出同样的“聪明”行为,即重新分配给定的一代内存的哪个部分,或者它是否只寻找碎片出现时的狭窄情况。发布的答案表明,固定并不能阻止对象升级。所以这个问题的前提是无效的。“促销”背后的魔力比大多数.NET程序员想象的要小得多。很容易在心里将其建模为从堆的一个部分到另一个部分的相关副本。根本不是这样,它只是更改了一个“this is the gen#0 heap segment”指针。或第1代。要固定整个短暂的段是非常困难的,大型对象堆非常有帮助。“GC并不糟糕!”HansPassant澄清一下,我想知道GC是否表现出同样的“聪明”行为,即重新分配给定的一代内存的哪个部分,或者它是否只寻找出现碎片的狭窄环境。