可能重复:
在ConcurrentBag可能memoryleak?
EDIT1:
实际的问题是。 你能否证实这个或者是我错了样品和我丢失的财产以后明显?
我还以为是ConcurrentBag为的simpy的unorderd列表的替代品。 但是我错了。 ConcurrentBag本身不作为的ThreadLocal添加到创建线程,其基本上不会导致内存泄漏。
class Program
{
static void Main(string[] args)
{
var start = GC.GetTotalMemory(true);
new Program().Start(args);
Console.WriteLine("Diff: {0:N0} bytes", GC.GetTotalMemory(true) - start);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Thread.Sleep(5000);
}
private void Start(string[] args)
{
for (int i = 0; i < 1000; i++)
{
var bag = new ConcurrentBag<byte>();
bag.Add(1);
byte by;
while (bag.TryTake(out by)) ;
}
}
我可以取决于有多少数据我添加到包使DIFF 250 KB或100 GB。 该数据也袋消失。
当我打入这个使用WinDbg和我做了!DumpHeap型并发
....
000007ff00046858 1 24 System.Threading.ThreadLocal`1+GenericHolder`3[[System.Collections.Concurrent.ConcurrentBag`1+ThreadLocalList[[System.Byte, mscorlib]], System],[System.Threading.ThreadLocal`1+C0[[System.Collections.Concurrent.ConcurrentBag`1+ThreadLocalList[[System.Byte, mscorlib]], System]], mscorlib],[System.Threading.ThreadLocal`1+C0[[System.Collections.Concurrent.ConcurrentBag`1+ThreadLocalList[[System.Byte, mscorlib]], System]], mscorlib],[System.Threading.ThreadLocal`1+C0[[System.Collections.Concurrent.ConcurrentBag`1+ThreadLocalList[[System.Byte, mscorlib]], System]], mscorlib]]
000007feed812648 2 64 System.Collections.Concurrent.ConcurrentStack`1[[System.Int32, mscorlib]]
000007feece41528 1 112 System.Collections.Concurrent.CDSCollectionETWBCLProvider
000007ff000469e0 1000 32000 System.Threading.ThreadLocal`1+Boxed[[System.Collections.Concurrent.ConcurrentBag`1+ThreadLocalList[[System.Byte, mscorlib]], System]]
000007feed815900 1000 32000 System.Collections.Concurrent.ConcurrentStack`1+Node[[System.Int32, mscorlib]]
000007ff00045530 1000 72000 System.Collections.Concurrent.ConcurrentBag`1+ThreadLocalList[[System.Byte, mscorlib]]
当我创建一个空ConcurrentBag让一些工作线程添加到它ConcurrentBag及其数据将在那里只要创建线程仍然活着的数据。
这样,我得到了几个GB的内存泄漏。 我没有用一个列表和锁“修理”这一点。 ConcurrentBag可能是快,但它是无用的简单替换具有相同对象的生命周期的List。
如果我创建主线程上ConcurrentBag我只要线程是活动的继续使用它。 这不是我所期望的,它可以引起严重的疼痛。