垃圾收集器是否清理在{}块内创建的对象?

时间:2018-12-05 16:32:47

标签: c# garbage-collection

我有一个复杂的算法可以处理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是否清除{}块内实例化的对象?

此外,请记住,这只是一个说明我的问题的示例,代码非常不同。

1 个答案:

答案 0 :(得分:1)

因此,经过一些讨论和评论中的链接,答案是否定的。大括号{}根本无法帮助GC,即使它们从范围中删除了变量也是如此。

这样,GC可以清理仍在作用域中的内存,并且{}大括号是纯词法的。 GC.Collect();可能会清除变量,即使它们处于有效上下文中(当然,在代码中也将不再使用它们)。在大多数情况下,这不是必需的,因为GC将在需要时自动执行此操作。