可能是重复问题:
ConcurrentBag中可能存在内存泄漏?
我的应用程序存在严重的内存泄漏问题。在其中一个方法中添加到本地ConcurrentBag集合中的所有数据从未被收集。
以下是我使用它的简单代码示例:
void Main()
{
var l = new List<int>(){1,2,3,4};
Func(l);
l.Clear();
l=null;
}
void Func(List<int> list)
{
var bag = new ConcurrentBag<int>();
Parallel.ForEach(list, k=> bag.Add(++k));
list.Clear();
foreach(int i in bag) //I know, I doing it wrong.
{
list.Add(i);
}
}
我希望:在“Func”方法中创建的包将被创建和处理。
我看到:包从未被处理,它持有在Parallel.ForEach中创建的所有线程以及我添加的所有数据。=(
好的,我可以使用“TryTake”从包中删除项目,当我将其添加到列表中时。但是空包仍然保存在内存中。
现在我通过使用List解决了这个问题,但是我无法睡得很好,因为我在我的内存分析器中看到了这个。抱歉我的英语=)
更新:
我更改了我的“Func”方法:
void Func(List<int> list)
{
var bag = new ConcurrentBag<int>();
Parallel.ForEach(list, k=> bag.Add(++k));
list.Clear();
int i;
while(bag.TryTake(out i))
{
list.Add(i);
}
bag = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
然后我在VS中创建项目,编译并运行我的程序。这个实例图是由我在程序完成所有工作后10分钟内收集的内存快照,使用“.Net Memory Profiler 4.0”创建的:
http://xmages.net/storage/10/1/0/f/d/upload/4c67f305.jpg (抱歉,无法发布图片)
ConcurrentBag
使用终结器(很可能在内部类型中)导致它需要更长的时间来收集相关的内存? - Jon Skeet