我们在 .NET 框架中使用 C# 编写了一个 Windows 服务,几个小时后我们注意到第 2 代堆的大小变得异常。大部分空间都是免费的,dotMemory Profiler 向我们展示了这一代我们有大约 90% 的碎片。如何强制 .NET GC 压缩这个空间?这意味着 GC 可以释放这个空间,但它不能压缩它以供进一步使用。
问问题
2603 次
2 回答
1
由于 0,1,2 代将通过 GC 自行压缩和删除,
猜测对象在大对象堆上分配(LOH,对象大小> = 85K)
所以,你可以试试 LargeObjectHeapCompactionMode,它可以压缩 loh
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
参考:MSDN
于 2018-03-08T03:21:16.543 回答
0
第 2 代堆是小对象堆,所以基本上第 2 代也会压缩(因为我们调用 GC.Collect())
并且大对象堆(> = 85K)不会自动压缩。我想压缩LOH,可以使用.Net Framework。
所以一定要确定你用的是哪个堆~
于 2018-01-28T12:14:08.313 回答