日期:2014-05-16  浏览次数:20822 次

内存资源释放问题
各位大神们晚上好。
最近弄一个项目,运行之后,内存会缓慢增长。调用GC.Collect()能减少一些内存,过后又缓慢增长回来了。
很纠结,看了N遍代码,还是没搞清楚。
源代码太长,下面列出一部分,望大神们帮忙看看。

struct MyStruct
{
      public int ID;
      public string Name;
      ......
}

List<MyStruct> structList;

MyThread()
{
      while(!shouldStop)
      {
             //从前端设备获取相关参数,最后用structList存储起来

             string aString = "SomeString";
             //对aString执行一些操作,如SubString

             MyStruct aStruct = new MyStruct();
             //对aStruct赋值
             for(int i = 0; i < structList.Count; i++)
             {
                    if()...//判断list是否存在相同ID的struct对象,若存在
                    {
                           structList.RemoveAt(i);
                    }
                    structList.Add(aStruct);
                    break;
             }

             Thread.Sleep(2000);
      }
}

上面是一个从前端设备获取信息并存储的线程,线程是一直运行的。
请教各位大神,在这个线程中创建的变量(aString, aStruct)会不会被自动回收,对 list 执行remove,add操作会不会增加内存(使aStruct变量不能被回收?)。
谢谢各位。
------解决方案--------------------
判断是否会被回收的依据是:是否有人引用它~

因为List<MyStruct> structList; 一直存在
所以在里面的对象也会一直存在 aStruct也会存在(如果aStruct 引用了aString,那么aString也会一直存在)
当然如果它被RemoveAt出List了  就没有人引用了~
那么下次GC的时候它就要挂了~

我不知道你Remove的条件会移除多少~ 
看代码就是2秒中创建一个对象,并且这个对应一直被structList引用着~很安全,死神动不了它~
Console.WriteLine(structList.Count);//你可以不断第打印,看看有多少个对象
Thread.Sleep(2000);


------解决方案--------------------
[System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet =
System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
        public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
        /// <summary>
        /// 释放内存
        /// </summary>