首先,有多大被认为是大的?无论如何确定对象在堆中的大小?
.Net 4.5.1附带此LargeObjectHeapCompactionMode
:
将LargeObjectHeapCompactionMode属性设置为 GCLargeObjectHeapCompactionMode.CompactOnce,下一个完全阻塞 垃圾收集(和LOH的压缩)发生在 不确定的未来时间。您可以立即压缩LOH 使用如下代码:
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; GC.Collect();
据我所知,压缩LOH是件坏事!那么哪一个最差?致密的LOH或具有LOH碎裂?
答案 0 :(得分:8)
分配> = 85 KB进入LOH。压缩LOH也不错 - 只是LOH碎片并不是绝大多数应用需要担心的问题,因此对于它们来说,不值得为压缩付出代价。
当您分配多个大对象并且它们全部来自同一个地址空间页面时会发生碎片,然后让其中一些对象被收集。该页面中剩余的可用空间可能无法使用,因为它太小,甚至只是“遗忘”,因为分配器不会再次重新考虑使用它。
最终要使用的干净页面越来越少,因此分配器将在强制移动对象或甚至开始抛出OutOfMemory异常时开始减速。压缩将这些对象移动到新页面,回收可用空间。
您的应用是否具有此对象使用模式?大多数人没有。在64位平台上,您可能甚至都没有注意到它,因为在它成为一个巨大的问题之前,还有更多的地址空间要碎片化。