c# - 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
这里什么都不做。
这是为什么?
解决方案
尝试压缩 LOH
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect( );
另请注意,描述文档GC.Collect( )
始终使用“尝试”或“尝试”一词。
示例(强调我的):
使用此方法尝试回收所有不可访问的内存。它执行所有代的阻塞垃圾收集。
所有对象,无论它们在内存中存在多长时间,都会被考虑收集;但是,不会收集托管代码中引用的对象。使用此方法强制系统尝试回收最大数量的可用内存。
推荐阅读
- input - ExUnit.CaptureIO 仍然等待多个 IO.read 调用的输入
- c# - 如果记录存在,如何转到下一页?
- graph-theory - Java Jung Graph 聚类返回非直观聚类
- google-chrome - 书签加载旧版本的 Web 应用程序
- cloud - 我可以从谷歌云翻译 API 获得翻译文本的英文音译吗
- spring-boot - Spring Boot 2.1.0 with Jersey
- matlab - 加载 CSV 文件需要很长时间
- bash - 在标记之间改组文件的某些部分
- angular - http 错误是否总是在控制台中可见?
- mongodb - 猫鼬。按数组中的最后一个对象排序