从List<>发布的内存仅在添加新项目之后

时间:2015-09-02 01:56:09

标签: c# list garbage-collection

我在移除项目时从List<>释放内存时遇到问题。这是最奇怪的事情,只有在添加第二组项并从List<>中删除时才会从应用程序中释放内存。我能够使用这个简单的控制台应用程序来说明问题:

C# .Net4.0

namespace MemoryTestApp
{
    class Program
    {
        static int numObjects = 1000;
        static int objectSize = 10000;

        class Obj
        {
            byte[] buffer = new byte[objectSize];
            public Obj()
            {
                buffer[0] = 1;
                buffer[buffer.Length - 1] = 1;
            }
        }

        private static List<Obj> list = new List<Obj>();

        static void Main(string[] args)
        {
            while(true)
            {
                Console.WriteLine("Press Enter to add {0} objects to list...", numObjects);
                Console.ReadLine();

                //add to list of objects
                for (int i = 0; i < numObjects; i++)
                {
                    list.Add(new Obj());
                }

                //double num objects for next round so we can see which block of memory is released
                numObjects = numObjects * 2;

                Console.WriteLine("Press Enter to remove objects from list...");
                Console.ReadLine();

                foreach (Obj _obj in list.ToList())
                {
                    list.Remove(_obj);
                }

                GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
                GC.WaitForPendingFinalizers();

                Console.WriteLine("Press Enter to trim excess from list...");
                Console.ReadLine();

                list.TrimExcess();

                GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
                GC.WaitForPendingFinalizers();
            }
        }
    }
}

基本上,圆形N中添加的项目使用的内存块仅在添加新项目后才会被释放,然后在轮次N+1中删除(大约在圆形中更容易看到&gt; 3 )。我使用分辨率herehere测试了该问题,但行为似乎根本没有变化。

这可能仍与GC行为有关,但即使给出上述参考资料,我也无法按照我的预期进行工作。那么我的代码中的错误或我的期望在哪里?我非常感谢任何帮助。

0 个答案:

没有答案