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.
当我将此代码放入一个小型控制台项目时:
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.