内存资源释放问题
各位大神们晚上好。
最近弄一个项目,运行之后,内存会缓慢增长。调用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>