大对象堆压缩,什么时候好?

首先,有多大被认为是大的? 反正有没有确定一个对象在堆中的大小?

.Net 4.5.1附带了这个LargeObjectHeapCompactionMode

在将LargeObjectHeapCompactionMode属性设置为GCLargeObjectHeapCompactionMode.CompactOnce之后,下一个完全阻塞垃圾收集(以及LOH的压缩)将在不确定的未来时间发生。 您可以使用以下代码立即压缩LOH:

 GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; 

从我所听到的,压缩LOH是件坏事! 那么哪一个最差? 紧凑型LOH或LOH碎裂?

分配> = 85 KB进入LOH。 压缩LOH也不错 – 只是LOH碎片不是绝大多数应用需要担心的东西,所以对于它们来说,不值得为压缩而花费。

分配多个大对象时会发生碎片,并且它们都从相同的地址空间页面中获取,然后让其中一些对象被收集。 该页面中剩余的可用空间可能无法使用,因为它太小,甚至只是“遗忘”,因为分配器不会再次重新考虑使用它。

最终使用的干净页面越来越少,因此分配器将在强制移动对象或甚至开始抛出OutOfMemoryexception时开始减速。 压缩将这些对象移动到新页面,回收可用空间。

您的应用是否具有此对象使用模式? 大多数人没有。 在64位平台上,您甚至可能都没有注意到它,因为在它变成一个巨大的问题之前,要分割的地址空间要多得多。