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

本文关键字:2代堆 net GC 压缩 强制 | 更新日期: 2023-09-27 18:04:38

我们在。net框架下用c#编写了一个windows服务,几个小时后我们注意到第2代堆的大小变得不寻常。大部分空间都是空闲的,dotMemory Profiler显示我们在这一代中有大约90%的碎片。我如何执行。net GC来压缩这个空间?这意味着GC可以释放这个空间,但它不能压缩它以供进一步使用。

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

由于第0、1、2代将被GC压缩和删除,

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

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

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

Ref: MSDN

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

和大对象堆(>=85K)不会自动压缩。我想精简LOH,可以使用。net Framework。

所以一定要确定你用的是哪个堆~