我有一个复杂的算法可以处理30 GB以上的内存,并且我需要对其进行优化,因为有时会遇到System.OutOfMemory异常。
例如,想象一下这段代码:
span
现在,由于我将不再使用HashSet,因此我想告诉GC立即清除HashSet和可用内存。因此,我想知道这个简单的更改:
public void DoWork()
{
HashSet<MyStruct> hashSet = LoadALotOfStructs();
List<MyStruct> list = hashSet.ToList();
// Lot of code that can not use the hashSet anymore
}
可以做到吗?当它们脱离上下文时,GC是否清除{}块内实例化的对象?
此外,请记住,这只是一个说明我的问题的示例,代码非常不同。
答案 0 :(得分:1)
因此,经过一些讨论和评论中的链接,答案是否定的。大括号{}根本无法帮助GC,即使它们从范围中删除了变量也是如此。
这样,GC可以清理仍在作用域中的内存,并且{}大括号是纯词法的。 GC.Collect();
可能会清除变量,即使它们处于有效上下文中(当然,在代码中也将不再使用它们)。在大多数情况下,这不是必需的,因为GC将在需要时自动执行此操作。