C# 无法清除大型泛型集合的内存

标签 c# generics collections garbage-collection

我将 2 个非常大的数据集放入内存,执行连接以从第一个集合中过滤出一个子集,然后尝试销毁第二个集合,因为它使用了大约 600MB 的系统 RAM。问题是下面的代码不起作用。下面的代码运行后,会运行一个 foreach 循环,大约需要 15 分钟。在此期间,内存不会从 600MB+ 减少。我做错了什么吗?

List<APPLES> tmpApples = dataContext.Apples.ToList(); // 100MB
List<ORANGES> tmpOranges = dataContext.Oranges.ToList(); // 600MB

List<APPLES> filteredApples = tmpApples
    .Join(tmpOranges, apples => apples.Id, oranges => oranges.Id, (apples, oranges) => apples).ToList();
tmpOranges.Clear();
tmpOranges = null;
GC.Collect();

请注意,我稍后会重新使用 tmpApples,所以我现在不会清除它..

最佳答案

一些注意事项:

  • 除非您的 dataContext 可以被清除/垃圾收集,否则很可能会保留对很多对象的引用
  • 调用 Clear() 然后将变量设置为 null 是没有意义的,如果您真的没有对列表做任何其他事情的话。在几乎所有情况下,GC 都可以判断您何时不再使用变量。
  • 大概是在判断进程预留了多少内存;我不认为 CLR 实际上会将内存返回给操作系统,但是通过垃圾回收释放的内存将可用于在 CLR 中进一步使用。 (编辑:根据下面的评论,CLR 有可能释放大型对象堆的区域,但我不确定。)

关于C# 无法清除大型泛型集合的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5470300/

相关文章:

c# - 如何在两个 XML 标记之间放置一个值并使用 XmlDictionaryWriter 为 XML 元素的名称添加前缀?

java - Java 中 Class 类型的可变参数

java - 如何检查某个元素的功能是否包含在集合中?

c# - 参数 IEnumerable<T> c#

java - Collections.sort没有编译时错误

java - 使用 Spring 将嵌套集合中的对象转换为 JSON

c# - Gridview 检查其是否为空或 null

c# - 使 WPF 窗口免疫显示桌面(防止隐藏)

c# - 如何使用 LINQ 从 List<int> 中获取最接近的数字?

c# - 是否可以构造一个泛型方法以便 T 是可选的?