内存资源释放问题 内存 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 判断是否会被回收的依据是:是否有人引用它~因为List<MyStruct> structList; 一直存在所以在里面的对象也会一直存在 aStruct也会存在(如果aStruct 引用了aString,那么aString也会一直存在)当然如果它被RemoveAt出List了 就没有人引用了~那么下次GC的时候它就要挂了~我不知道你Remove的条件会移除多少~ 看代码就是2秒中创建一个对象,并且这个对应一直被structList引用着~很安全,死神动不了它~Console.WriteLine(structList.Count);//你可以不断第打印,看看有多少个对象Thread.Sleep(2000); 每次remove一个对象。因为设备是固定的,所以list的大小最后肯定是固定的(断点进去确认过)。假设,那个aString:aStruct.Name = aString.SubString(0,1);那么会有风险吗? 另外如果不使用remove,add,,,改为list[i] = aStruct,那么原先的对象会不会被回收,纠结啊~ 今天发现了一个新问题,连接数据库时报错,说系统内存已满,无法分配连接什么的。我在程序中连接数据库已使用了using,为何还会报错?using(SqlConnection conn = new SqlConnection) [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> public void ClearMemory() { GC.Collect(); GC.WaitForPendingFinalizers(); if (Environment.OSVersion.Platform == PlatformID.Win32NT) { SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1); } }可以线程 循环清理 这个已经写进程序了,30分钟会调用一次。能回答下sql连接的问题么?具体看上面回复,谢谢! 另外如果不使用remove,add,,,改为list[i] = aStruct,那么原先的对象会不会被回收,纠结啊~只要原来的对象没有在其他地方被引用,那么就会被回收,而且你定义的是struct,会随着堆栈的清理回收地更及时但是要注意struct不宜用来保存较大的对象看了一下你的程序,对相同标识的对象,你采用的是remove然后add为何不是find然后update?频繁的remove和add会影响性能,因为内存需要频繁的回收和分配,碎片也可能会增多,加重GC的负担 最后的解决方法:使用6楼所说的方法,间隔10分钟调用一次。在代码的关键线程中添加GC.Collect(); 。运行之后,程序初始占用内存为5M到6M之间,间隔一段时间会恢复6M到7M之间。总体来说还算稳定,虽然有时候会暴增到12M左右。结贴了,谢谢各位。 RadioButton选中时,触发什么控件 arraylist属性匹配删除不了??怎么弄? 问个问题.net中如何申明非局部变量啊? 紧急问题,项目就差这一步了,关于VS2005 想做个文本批量处理器,苦于没有思路,给点建议 多客户端的c#, 类似这样的XML如何解开? 高手帮忙啊~~水晶报表的问题~~ 怎么显示的数据不对啊~~急急人~~ 怎么向一个正在运行的控制台程序传递输入呀? url传参数的中文乱码问题 C#向sql插入数据 如何判断控件的Enabled属性
所以在里面的对象也会一直存在 aStruct也会存在(如果aStruct 引用了aString,那么aString也会一直存在)
当然如果它被RemoveAt出List了 就没有人引用了~
那么下次GC的时候它就要挂了~我不知道你Remove的条件会移除多少~
看代码就是2秒中创建一个对象,并且这个对应一直被structList引用着~很安全,死神动不了它~
Console.WriteLine(structList.Count);//你可以不断第打印,看看有多少个对象
Thread.Sleep(2000);
因为设备是固定的,所以list的大小最后肯定是固定的(断点进去确认过)。
假设,那个aString:aStruct.Name = aString.SubString(0,1);
那么会有风险吗?
using(SqlConnection conn = new SqlConnection)
System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
/// <summary>
/// 释放内存
/// </summary>
public void ClearMemory()
{
GC.Collect();
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}可以线程 循环清理
但是要注意struct不宜用来保存较大的对象看了一下你的程序,对相同标识的对象,你采用的是remove然后add
为何不是find然后update?
频繁的remove和add会影响性能,因为内存需要频繁的回收和分配,碎片也可能会增多,加重GC的负担
使用6楼所说的方法,间隔10分钟调用一次。
在代码的关键线程中添加GC.Collect(); 。
运行之后,程序初始占用内存为5M到6M之间,间隔一段时间会恢复6M到7M之间。
总体来说还算稳定,虽然有时候会暴增到12M左右。
结贴了,谢谢各位。