【发布时间】:2013-11-30 21:08:33
【问题描述】:
首先,多大才算大?有没有办法确定一个对象在堆中有多大?
.Net 4.5.1 自带这个LargeObjectHeapCompactionMode:
LargeObjectHeapCompactionMode 属性设置为之后 GCLargeObjectHeapCompactionMode.CompactOnce,下一次全阻塞 垃圾收集(和 LOH 的压缩)发生在 未来时间不确定。您可以通过以下方式立即压缩 LOH 使用如下代码:
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; GC.Collect();
据我所知,压缩 LOH 是一件坏事!那么,哪一个最差?紧凑 LOH 还是存在 LOH 碎片?
【问题讨论】:
-
除非你真的有问题,否则不要担心 GC。手动摆弄 GC 几乎不会带来任何好处。
-
@HansPassant 哈哈哈......性能方面,对于非脾气暴躁的程序员来说,真的那么糟糕吗?
-
没有好坏之分;这是一个权衡。如果您的应用程序由于 LOH 碎片而运行到 OOM,则在某些情况下压缩 LOH 并从您的应用程序中挤出额外的运行时间可能会更好。另一个选项(并且,在 .NET 4.5 之前,唯一的选项)是在 LOH 变得过于分散时重新启动应用程序。您将需要分析使用和不使用 LOH 压缩的应用程序以确定性能影响。 (我想另一种选择是避免创建大型对象,例如,如果您处理大型数组,则可以对它们进行分段,但是.. ugh)。
标签: c# .net memory-management .net-4.5