c# - Large Object Heap Compaction,什么时候好?

标签 c# .net memory-management .net-4.5

首先,多大才算大?有没有办法确定一个对象在堆中有多大?

.Net 4.5.1 带有此 LargeObjectHeapCompactionMode:

After the LargeObjectHeapCompactionMode property is set to GCLargeObjectHeapCompactionMode.CompactOnce, the next full blocking garbage collection (and compaction of the LOH) occurs at an indeterminate future time. You can compact the LOH immediately by using code like the following:

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();      

据我所知,压缩 LOH 是一件坏事!那么,哪个最差呢?紧凑的 LOH 还是具有 LOH 碎片?

最佳答案

分配 >= 85 KB 进入 LOH。压缩 LOH 并不坏——只是 LOH 碎片不是绝大多数应用程序需要担心的事情,因此对于它们来说不值得压缩开销。

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

最终,可供使用的干净页面越来越少,因此分配器将开始变慢,因为它会强制移动对象,甚至开始抛出 OutOfMemory 异常。压缩将这些对象移动到新页面,回收可用空间。

您的应用是否有这种对象使用模式?大多数没有。在 64 位平台上,您甚至可能不会注意到它,因为在它成为一个大问题之前,有相当多的地址空间需要碎片化。

关于c# - Large Object Heap Compaction,什么时候好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20035550/

相关文章:

c# - 等待一项任务而不等待其他任务是否可以?

c# - 尝试访问 Xamarin.Forms Android 上的服务器时引发 System.AggregateException

c# - NHibernate 的 Nunit 测试出现奇怪的失败

javascript - AJAX UpdatePanel 回发后滚动到 SharePoint Visual Web 部件上的位置

c++ - c中的BSS段,进展方式

c++ - delete[]性能问题

c# - 使用 nreco 将图像与视频合并

java - 'weka.core.WekaPackageManager' 的类型初始值设定项抛出异常 - weka c#

c# - 以编程方式更改播放设备 xp

iphone - 内存警告后 EXC_BAD_ACCESS