具有数据结构(字典、列表等)的C#.NET内存管理

具有数据结构(字典、列表等)的C#.NET内存管理,c#,.net,data-structures,memory-management,garbage-collection,C#,.net,Data Structures,Memory Management,Garbage Collection,我希望有人能在下面的例子中解释一下.NET是如何处理垃圾收集的 我有一个程序,我需要执行一种非常特殊的“在文件中查找”功能,就像您在VisualStudio中看到的那样。我必须搜索数千个文件,并在一个List(Pair())对象中收集结果,其中Pair是我创建的一个简单类,用于存储一对项目(显然) 当我使用完我需要的东西后,我会调用列表上的Clear(),以清除旧信息。这似乎无助于释放内存,因为我可以在任务管理器上看到所消耗的内存没有减少 对于一个非常大的搜索,我可能要处理5000000行需要处

我希望有人能在下面的例子中解释一下.NET是如何处理垃圾收集的

我有一个程序,我需要执行一种非常特殊的“在文件中查找”功能,就像您在VisualStudio中看到的那样。我必须搜索数千个文件,并在一个List(Pair())对象中收集结果,其中Pair是我创建的一个简单类,用于存储一对项目(显然)

当我使用完我需要的东西后,我会调用列表上的Clear(),以清除旧信息。这似乎无助于释放内存,因为我可以在任务管理器上看到所消耗的内存没有减少

对于一个非常大的搜索,我可能要处理5000000行需要处理的信息(在我的机器上大约500MB的内存使用)。当我的搜索完成时,内存消耗水平保持不变。我让我的结对类实现IDisposable,但这没有帮助


知道我遗漏了什么吗?谢谢

垃圾收集将在需要时清除内存,也就是说,不是在您“清除”列表时,而是在发现其中引用的所有项都不再被引用时,以及在进程/计算机内存不足时


无需对C#中的内存进行微观管理。

垃圾收集将在需要时清除内存,也就是说,不是在“清除”列表时,而是在发现其中引用的所有项都不再被引用以及进程/计算机内存不足时清除内存


无需在C#中对内存进行微管理。

该.NET垃圾收集器的性能出人意料地好。一般来说,您不应该担心在任务管理器中看到的内存消耗,因为正如您所观察到的,垃圾收集器不会像您所想的那样尽快回收内存。原因是回收内存是一项昂贵的操作。如果那一刻不需要记忆,为什么要在那里胡闹?内部的工作是当它真的去回收空间是相当复杂的。GC通过不同级别的收集(称为代)来回收为速度优化的内存

有很多文章可以比我更详细地解释这一点。这是一个起点


现在,您应该看到在什么时候会出现内存异常(如果有的话),并从那里开始

.NET垃圾收集器的性能出人意料地好。一般来说,您不应该担心在任务管理器中看到的内存消耗,因为正如您所观察到的,垃圾收集器不会像您所想的那样尽快回收内存。原因是回收内存是一项昂贵的操作。如果那一刻不需要记忆,为什么要在那里胡闹?内部的工作是当它真的去回收空间是相当复杂的。GC通过不同级别的收集(称为代)来回收为速度优化的内存

有很多文章可以比我更详细地解释这一点。这是一个起点

现在,您应该看到在什么时候会出现内存异常(如果有的话),并从那里开始

当调用
Clear()
时,对
对象对的所有引用都将被删除,这将导致这些对象最终被GC'ed,除非另一个对象持有对它们的引用,但您不能指望什么时候会发生,这还取决于内存压力

作为一个旁注,当调用
Clear()
时,可以在C#4中使用
Pair
而不是
Clear()
时,对
Pair
对象的所有引用都将被删除,这将导致最终对这些对象进行GC'ed,除非另一个对象持有对它们的引用,但你不能指望什么时候会发生——这也取决于内存压力


作为旁注,您可以在C#4中使用,而不是在Pair对象中存储什么?您只是在存储文件路径,还是实际上在保留某种本机资源(如文件句柄?),对“GC.Collect()”的调用将强制运行垃圾收集。这将帮助您立即了解清理了多少内存。但是,仅使用GC.Collect()调试此问题-不要将其留在代码中,除非您完全确定它应该存在!您在Pair对象中存储了什么?您只是在存储文件路径,还是实际上在保留某种本机资源(如文件句柄?),对“GC.Collect()”的调用将强制运行垃圾收集。这将帮助您立即了解清理了多少内存。但是,仅使用GC.Collect()调试此问题-不要将其留在代码中,除非您完全确定它应该存在!