前言:.NET 一直所为人诟病的就是“胃口太大”,狂吃内存,虽然微软声称 GC 的功能和智能化都很高,但是内存的回收问题,一直存在困扰,尤其是 winform 程序,其主要原因是因为.NET程序在启动时,是需要由JIT动态编...

前言:
.NET 一直所为人诟病的就是“胃口太大”,狂吃内存,虽然微软声称 GC 的功能和智能化都很高,但是内存的回收问题,一直存在困扰,尤其是 winform 程序,其主要原因是因为.NET程序在启动时,是需要由JIT动态编译并加载的,这个加载会把所有需要的资源都加载进来,很多资源是只有启动时才用的。
以XP 系统为例子,程序启动后,打开任务管理器,会看到占用的内存量比较大,你把程序最小化,会发现该程序占用的内存迅速减小到一个很小的值,再恢复你的程序,你会发现内存占用又上升了,但是比你刚启动时的内存占用值还是小的,这就是一个资源优化的过程,这个过程是操作系统主动完成的。
Winform降低系统内存占用的优化方案:
1、使用性能测试工具dotTrace 3.0,它能够计算出你程序中哪些代码占用内存较多
2、强制垃圾回收
3、用timer,每几秒钟调用:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
4、发布的时候选择Release
5、注意代码编写时少产生垃圾,比如String + String就会产生大量的垃圾,可以用StringBuffer.Append
6、this.Dispose(); this.Dispose(True); this.Close(); GC.Collect();
7、注意变量的作用域,具体说某个变量如果只是临时使用就不要定义成成员变量。GC是根据关系网去回收资源的。
8、检测是否存在内存泄漏的情况,详情可参见:内存泄漏百度百科
定期清理执行垃圾回收的代码:
使用方法:在窗口程序中用一个timer计时器,每隔几秒钟调用一次该释放内存的ClearMemory()函数即可!
#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)
{
//FrmMian为我窗体的类名
FrmMian.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}
#endregion
下图是使用ClearMemory()前后的内存消耗对比图:
本文标题为:C#--winform应用程序运行内存变大


基础教程推荐
- WINFORM 窗体间的传值实现解析 2023-02-02
- C#使用Gembox.SpreadSheet向Excel写入数据及图表的实例 2022-11-30
- 自定义WPF窗体形状的实战记录 2022-12-31
- C# 操作网络适配器的示例 2023-03-13
- 新手小白用C# winform 读取Excel表的实现 2023-03-28
- C#操作DataGridView设置单元格只读 2023-05-22
- C# 用什么方法将BitConverter.ToString产生字符串再转换回去 2023-02-06
- C#四舍五入MidpointRounding.AwayFromZero解析 2023-07-19
- c# – SqlGeography从多边形获取多边形 2023-11-09
- c# Async streams的使用解析 2023-04-14