大对象堆压缩,什么时候好?
首先,有多大被认为是大的? 反正有没有确定一个对象在堆中的大小?
.Net 4.5.1附带了这个LargeObjectHeapCompactionMode
:
在将LargeObjectHeapCompactionMode属性设置为GCLargeObjectHeapCompactionMode.CompactOnce之后,下一个完全阻塞垃圾收集(以及LOH的压缩)将在不确定的未来时间发生。 您可以使用以下代码立即压缩LOH:
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
从我所听到的,压缩LOH是件坏事! 那么哪一个最差? 紧凑型LOH或LOH碎裂?
分配> = 85 KB进入LOH。 压缩LOH也不错 – 只是LOH碎片不是绝大多数应用需要担心的东西,所以对于它们来说,不值得为压缩而花费。
分配多个大对象时会发生碎片,并且它们都从相同的地址空间页面中获取,然后让其中一些对象被收集。 该页面中剩余的可用空间可能无法使用,因为它太小,甚至只是“遗忘”,因为分配器不会再次重新考虑使用它。
最终使用的干净页面越来越少,因此分配器将在强制移动对象或甚至开始抛出OutOfMemoryexception时开始减速。 压缩将这些对象移动到新页面,回收可用空间。
您的应用是否具有此对象使用模式? 大多数人没有。 在64位平台上,您甚至可能都没有注意到它,因为在它变成一个巨大的问题之前,要分割的地址空间要多得多。
- 运行已安装的应用程序时,Environment.CurrentDirectory会产生意外结果
- WCF – 让客户检查服务可用性
- Form.ShowDialog()不显示启用调试的窗口
- LINQ查询与Distinct和Union
- 为什么Silverlight TextBox使用\ r代替换行而不是Environment.Newline(\ r \ n)?
- 什么消耗更少的资源,并且更快地存储在StringBuilder中的File.AppendText或File.WriteAllText?
- 当从针对任何CPU的C#项目调用时,为什么此代码会抛出System.AccessViolationException?
- 将Json.NET对象转换为传统的.NET对象,而不知道类型
- 在Dispose方法中关闭数据库连接是对的吗?