强制.NET GC压缩或整理第2代堆?

时间:2016-08-30 13:11:32

标签: c# .net garbage-collection defragmentation heap-fragmentation

我们在.NET框架中用C#编写了一个Windows服务,几个小时后我们注意到第2代堆的大小越来越不寻常。 大部分空间都是免费的,dotMemory Profiler向我们展示了我们在这一代上有大约90%的碎片。 如何强制.NET GC来压缩这个空间?这意味着GC可以释放这个空间,但它无法压缩它以供进一步使用。

2 个答案:

答案 0 :(得分:0)

第2代堆是小对象堆,所以基本上gen 2也会压缩(因为我们调用GC.Collect())

大对象堆(> = 85K)不会自动压缩。 我想压缩LOH,你可以使用.Net Framework。

所以要确定你使用的是哪个堆〜

答案 1 :(得分:0)

由于第0,1,2代将通过GC压缩和删除它自己,

猜猜对象在大对象堆上分配(LOH,对象大小> = 85K)

所以,你可以尝试LargeObjectHeapCompactionMode,它可以压缩loh

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

参考:MSDN