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