首先,多大才算大?有没有办法确定堆中对象有多大?
.Net 4.5.1 附带了这个LargeObjectHeapCompactionMode
:
LargeObjectHeapCompactionMode 属性设置为后
GCLargeObjectHeapCompactionMode.CompactOnce,下一次完全阻塞
垃圾收集(和 LOH 的压缩)发生在
不确定的未来时间。您可以立即压缩 LOH
使用如下代码:
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
据我所知,压缩 LOH 是一件坏事!那么,哪一个最糟糕呢? LOH 紧凑还是 LOH 碎片化?
>= 85 KB 的分配进入 LOH。压缩 LOH 并不是坏事 - 只是 LOH 碎片不是绝大多数应用程序需要担心的问题,因此对于它们来说,不值得花费压缩的费用。
当您分配多个大对象并且它们全部从地址空间的同一页获取,然后让其中一些对象被收集时,就会发生碎片。该页面中剩余的可用空间可能无法使用,因为它太小,或者甚至只是“忘记”,因为分配器不会重新考虑再次使用它。
最终,可供使用的干净页面越来越少,因此分配器将开始减慢,因为它强制移动对象,甚至开始抛出 OutOfMemory 异常。压缩将这些对象移动到新页面,回收可用空间。
您的应用程序有这种对象使用模式吗?大多数人没有。在 64 位平台上,您甚至可能不会注意到它,因为在它成为一个大问题之前,还有相当多的地址空间需要碎片化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)