我已经了解了代和大对象堆,但我仍然无法理解拥有大对象堆的意义(或益处)是什么?
如果CLR只依靠第二代来存储大型对象(考虑到Gen0和Gen1的阈值过小),可能会出现什么问题(在性能或内存方面)?
我已经了解了代和大对象堆,但我仍然无法理解拥有大对象堆的意义(或益处)是什么?
如果CLR只依靠第二代来存储大型对象(考虑到Gen0和Gen1的阈值过小),可能会出现什么问题(在性能或内存方面)?
在64位操作系统上运行代码,可以完全消除一个问题。64位进程有8TB的虚拟内存地址空间,比32位进程多了3个数量级。你绝对不会用尽内存。
简而言之,LOH使代码运行更有效率。但代价是使用可用的虚拟内存地址空间不够高效。
更新,.NET 4.5.1现在支持压缩LOH,GCSettings.LargeObjectHeapCompactionMode属性。请注意后果。
我不是CLR专家,但我认为为大对象设置专用堆可以防止对现有分代堆的不必要GC扫描。分配大对象需要大量连续的自由内存。为了从分散的分代堆中提供这些内存,“洞”需要频繁压缩(只能在GC周期中完成)。