¿Hay una pérdida de memoria en la implementación de ConcurrentBag <T>? [duplicar]

Posible duplicado:
Posible pérdida de memoria en ConcurrentBag?

Edit1:

La pregunta real es. ¿Puede confirmar esto o mi muestra es incorrecta y me falta algo obvio?

He pensado que ConcurrentBag es simplemente un reemplazo para una lista desordenada. Pero estaba equivocado. ConcurrentBag se agrega como ThreadLocal al subproceso de creación que básicamente provoca una pérdida de memoria.

   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)) ;
            }
        }

Puedo hacer Diff 250 KB o 100 GB dependiendo de la cantidad de datos que agregué a las bolsas. Los datos ni las bolsas se van.

Cuando entro en esto con Windbg y hago un! DumpHeap -type Concurrent

....

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]]

Cuando creo un ConcurrentBag vacío para permitir que algunos subprocesos de trabajo le agreguen datos, ConcurrentBag y sus datos estarán allí mientras el subproceso de creación aún esté vivo.

De esta manera conseguí una pérdida de memoria de varios GB. Hice "arreglar" esto usando una Lista y bloqueos. ConcurrentBag puede ser rápido, pero es inútil como simple reemplazo de una Lista con el mismo tiempo de vida del objeto.

Si alguna vez creo un ConcurrentBag en el hilo principal, lo mantendré mientras el hilo esté vivo. Esto no es algo que yo esperaría y puede causar un gran dolor.

Respuestas a la pregunta(3)

Su respuesta a la pregunta