首页 > 解决方案 > CG.Collect 在我的大应用程序中不起作用,但在一个小项目中工作正常

问题描述

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

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这里什么都不做。

这是为什么?

标签: c#memorygarbage

解决方案


尝试压缩 LOH

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

另请注意,描述文档GC.Collect( )始终使用“尝试”或“尝试”一词。

示例(强调我的):

使用此方法尝试回收所有不可访问的内存。它执行所有代的阻塞垃圾收集。

所有对象,无论它们在内存中存在多长时间,都会被考虑收集;但是,不会收集托管代码中引用的对象。使用此方法强制系统尝试回收最大数量的可用内存。


推荐阅读