我在移除项目时从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 )。我使用分辨率here和here测试了该问题,但行为似乎根本没有变化。
这可能仍与GC行为有关,但即使给出上述参考资料,我也无法按照我的预期进行工作。那么我的代码中的错误或我的期望在哪里?我非常感谢任何帮助。