CG.Collect 在我的大应用程序中不起作用,但在小项目中工作正常

CG.Collect doesn't work in my big app, but works fine in a small project

当我将此代码放入一个小型控制台项目时:

Console.WriteLine($"Mémoire avant allocation 1G: {GC.GetTotalMemory(false)}");

byte[] buf = new byte[1000000000];

Console.WriteLine($"Mémoire après allocation 1G: {GC.GetTotalMemory(false)}");

buf = null;

GC.Collect();

GC.WaitForPendingFinalizers();

GC.Collect();

Console.WriteLine($"Mémoire après libération 1G: {GC.GetTotalMemory(false)}");

我得到以下结果(如预期):

  Mémoire avant allocation 1G: 30028

  Mémoire après allocation 1G: 1000038252

  Mémoire après libération 1G: 29472

现在我正在处理的大型应用程序中的代码完全相同,我得到了这个结果:

Mémoire avant allocation 1G: 153152496

Mémoire après allocation 1G: 1153152552

Mémoire après libération 1G: 1146813960

如您所见,GC.Collect 在这里什么都不做。

这是为什么?

尝试压缩 LOH

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

另请注意,描述 GC.Collect( ) 的文档始终使用词 "tries" 或 "try"。

示例(强调我的):

Use this method to try to reclaim all memory that is inaccessible. It performs a blocking garbage collection of all generations.

All objects, regardless of how long they have been in memory, are considered for collection; however, objects that are referenced in managed code are not collected. Use this method to force the system to try to reclaim the maximum amount of available memory.