最近做一个winform项目,运行一段时间后,内存由刚启动的20M左右上升到100M以上,界面变得很卡,在无任何界面操作的情况下内存是不会上升的。
我在每个窗体关闭时都加了内存回收函数:GC.Collect()与定时调用系统内存释放函数:
[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
后,内存占用小了,但是虚拟内存占用仍然高,操作一段时间后,界面又开始卡,求大神指点。。
我在每个窗体关闭时都加了内存回收函数:GC.Collect()与定时调用系统内存释放函数:
[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
后,内存占用小了,但是虚拟内存占用仍然高,操作一段时间后,界面又开始卡,求大神指点。。
解决方案 »
- 关于协议中某个字节大于255怎么办
- 文本编辑器
- 新手求助:listview或datagridview实现自动多列方法
- 接上贴,方案投票并说明原因
- 急!DirectX编程之.X文件生成?
- 求一个采购管理系统的数据库设计结构
- 关于pdf格式文件的问题
- 关于DataGrid的焦点问题,实在是搞不定了,盼高手解答!!!!!!!
- How to get the language of my OS ( chinese or english), how to activate full shape ,half shape and punctuation?
- silverlight OOB问题
- 问个小问题
- 委托,事件 求助
手动去强制垃圾回收例如:
Marshal.FinalReleaseComObject(obj);
GC.ReRegisterForFinalize(obj);
他们去做这些事也是会消耗资源的。
如果不确定哪些是否释放掉的话,
建议楼主多用using( ){ }语句块,
由系统去管理资源释放以节省不必要的麻烦。
当我用了之后才觉得扯淡个人感觉最好还是在代码里改动比较好
不要好多东西都要用内存
#region 内存回收
[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
/// <summary>
/// 释放内存
/// </summary>
public static void ClearMemory()
{
GC.Collect();
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}
#endregion
频繁使用 GC.Collect() 进行收回反而会影响程序的性能