【发布时间】:2013-11-25 02:48:22
【问题描述】:
我有很多对象,每个对象都有很多成员,我需要在每个成员中插入一些集合数据,并在使用它们后再次清除它们.. 清除后我希望 GC.Collect() 可以立即申请内存使用,但它的外观并没有减少内存使用量。我检查过任务管理器总是在增加。只有在所有处理任务完成后,我才注意到内存使用量下降了。
在我的电脑上内存使用率达到了 10G 几乎 100%.. 并且只有在所有处理完成后才会下降.. 我担心如果客户端电脑内存不足会导致内存不足异常
我注意到清除所有收集数据看起来并没有减少内存使用量。 我应该如何收回记忆?
在线程内的循环内调用 GC.Collect 可以吗?
插图看起来像这样。 例如:
public class Progress
{
var obj2 = new Obj2();
public void Processing()
{
//here my thread start.. (I have some thread class)
AsyncClass.DoTask(() =>
{
foreach(var curProcess in AllObjects)
{
var allSolutions = (from m in curProcess.memories
where....
select m).ToList();
forearch(var memory in allSolutions)
{
foreach(data in alldata)
{
//some process
...
...
result = data.result;
//pushing the data into memory members obj
obj2.PushCalculation(memory, result)
}
}
forearch(var memory in allSolutions)
{
obj2.ClearValues(memory)
}
GC.Collect();
GC.WaitForPendingFinalizers();
}
});
}
}
public class Obj2 : IDisposable
{
public void PushCalculation(memoryObj mem, List<data> results)
{
foreach(var result in results)
{
mem.data1.add(result);
mem.data2.addrange(result * 1);
//etc... all about pushing into memory object members
}
}
public void ClearValues(memoryObj mem)
{
// clear all collections of memoryObj members
mem.data1.Clear();
mem.data1 = null;
mem.data2.Clear();
mem.data2 = null;
......
......
}
}
【问题讨论】:
-
这些物品是一次性的,您是否正在处理它们?
-
在您的处理完成之前内存使用量不会下降的事实告诉我没有要收集的垃圾。垃圾回收并不是一个神奇的“缩小我的内存使用量”功能。
-
@Raymond Chen,清除动态集合不会释放一些内存使用吗?
-
垃圾收集无法释放仍可访问的内存。这会导致崩溃。
-
此外,没有理由假设任务管理器报告的任何内存统计信息与托管堆的大小有任何关系。大多数人甚至不明白任务管理器中报告的“内存大小”是什么意思。
标签: c# memory garbage-collection