背景:
微软的 .NET FRAMEWORK 现在可谓如火如荼了。但是,.NET 一直所为人诟病的就是“胃口太大”,狂吃内存,虽然微软声称 GC 的功能和智能化都很高,但是内存的回收问题,一直存在困扰,尤其是 winform 程序,其主要原因是因为.NET程序在启动时,是需要由JIT动态编译并加载的,这个加载会把所有需要的资源都加载进来,很多资源是只有启动时才用的。
以XP 系统为例子,程序启动后,打开任务管理器,会看到占用的内存量比较大,你把程序最小化,会发现该程序占用的内存迅速减小到一个很小的值,再恢复你的程序,你会发现内存占用又上升了,但是比你刚启动时的内存占用值还是小的,这就是一个资源优化的过程,这个过程是操作系统主动完成的。
结论与展望:
创新设计大赛的项目已经快到交付的日期了,
都说Winform占用内存大,于是想着看看自己写的基于手机邮件的远程关机软件(Mail_Based_Remote_Shutdown)占用内存情况,
整个开发过程自己也在尽量写一些比较优美的代码来减少系统内存占用,今天看了下,刚打开时占用20M内存,
然后一点点增加,最后到80多M,真是无法忍受,
每次都是写了之后回过头来才发现自己的代码很丑,系统架构师的作用就体现出来了。
这里整理了一些网上关于Winform如何降低系统内存占用的资料,供参考,待更新:
1、使用性能测试工具dotTrace 3.0,它能够计算出你程序中那些代码占用内存较多
2、强制垃圾回收
3、多dispose,close
4、用timer,每几秒钟调用:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);具体见附录。
5、发布的时候选择Release
6、注意代码编写时少产生垃圾,比如String + String就会产生大量的垃圾,可以用StringBuffer.Append
7、this.Dispose();    this.Dispose(True);   this.Close();    GC.Collect();   
8、注意变量的作用域,具体说某个变量如果只是临时使用就不要定义成成员变量。GC是根据关系网去回收资源的。
9、检测是否存在内存泄漏的情况,详情可参见:内存泄漏百度百科
附录:定期清理执行垃圾回收代码:
//在程序中用一个计时器,每隔几秒钟调用一次该函数,打开任务管理器,你会有惊奇的发现
#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)
{
App.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}
#endregion

转载于:https://www.cnblogs.com/GarsonZhang/p/4432067.html

(转)C# Winform应用程序占用内存较大解决方法整理相关推荐

  1. C# Winform应用程序占用内存较大解决方法整理(转)

    C# Winform应用程序占用内存较大解决方法整理(转) 参考文章: (1)C# Winform应用程序占用内存较大解决方法整理(转) (2)https://www.cnblogs.com/xcsn ...

  2. C# Winform应用程序占用内存较大解决方法整理(转)-- SetProcessWorkingSetSize

    一.C# Winform应用程序占用内存较大解决方法整理(转) 原文:  http://www.jb51.net/article/56682.htm 背景: 微软的 .NET FRAMEWORK 现在 ...

  3. SQL Server 2008 R2占用内存越来越大解决方法

    SQL Server 2008 R2占用内存越来越大解决方法 参考文章: (1)SQL Server 2008 R2占用内存越来越大解决方法 (2)https://www.cnblogs.com/pe ...

  4. unity3d占用内存太大解决方法

    原帖:http://www.onevcat.com/2012/11/memory-in-unity3d/ 转载自星辰 Unity3D占用内存太大的解决方法 最近网友通过网站搜索Unity3D在手机及其 ...

  5. 微信小程序使用Echarts真机调试报错,Echarts占内存过大解决方法

    Echarts真机调试报错 解决办法:给组件添加force-use-old-canvas="true"属性就可以在真机调试里展示. 重点:发布线上时,一定要将这句去掉,现在只是不支 ...

  6. Svchost.exe占用内存过大解决

    Svchost.exe病毒的简单处理 1.当发现Svchost.exe不在%systemroot%\System32目录中的,可以安全删除,同时在注册表中查找对应的注册项删除掉.  或用 taskli ...

  7. dwm.exe(桌面窗口管理器)占用内存过大解决办法

    今天突然发现内存占用峰值竟然到了98%,我是16G内存的,虽然不是很大,但是也绝对够用了,是什么情况导致内存占用一下子这么高了呢?于是乎我查了一下原来是dwm.exe占用的.特来总结如何处理此类占用问 ...

  8. 微信小程序包体积过大解决方法

    因为微信开发者工具提交需要整个项目大小不超过2M,超过2M则不能提交,会出现下面这个报错 解决方法: 1.在Hbuilder x上面勾选上运行时压缩代码 2.分包操作 在pages.json文件中设置 ...

  9. “为硬件保留的内存”过大解决方法

    问题起源:在用Android Studio运行模拟器的时候系统卡死,重启后就发现8G的内存为硬件保留了6个G,导致只有两个G的可用内存 尝试过的方法: msconfig里设置最大可用内存 运行Wind ...

最新文章

  1. jquery click 第一次没用_【通知】同济大学研究生会20202021学年第一次主席联席会...
  2. 好久不更新这个博客了。
  3. 国内远程医疗市场快速增长
  4. 美科学家研发能从干燥的沙漠空气中造水的新设备
  5. html中字体 楷体_css怎么设置字体为楷体?
  6. C++借助Eigen库实现矩阵开方(开根号)运算
  7. RPL(7):RFC6550翻译(7)---Upward Routes
  8. 阻止计算机病毒入侵系统,入侵预防系统
  9. 综合日语第一册第六课
  10. trainning 2017-11-21
  11. java-php-net-python-校园OTO超市系统ssm-视频计算机毕业设计程序
  12. 区块链技术在软件开发中的应用
  13. 最新最全各大网站收录、搜索引擎的提交入口
  14. mysql 聚簇索引与非聚簇索引
  15. 第十一篇:读《文明,现代化,价值投资与中国》
  16. mysql数据库中的自增字段会不会溢出,我用的是int,万一超过这个int的表示范围会怎样
  17. 番外7林芝·救赎之旅的最后一站·中——AI主题科幻小说《地与光》
  18. Python多项式相加
  19. 日常学习记录——决策树根节点的选择
  20. 51.性能调优之广播大变量

热门文章

  1. mui 页面滚动解决方案
  2. 基于ajax请求异常捕获
  3. DB2 sql报错后查证原因与解决问题的方法
  4. centos7在线yum安装mysql时官方镜像下载过慢的解决方案
  5. 拒绝:请求的对资源的访问被拒绝:泊坞窗
  6. 检索方法应该返回#39;null#39;还是无法产生返回值时引发异常? [关闭]
  7. win11系统安装打印机的方法
  8. android中搜索对话框,android – 如何使用onSearchRequested()调用搜索对话框
  9. linux php 中文乱码解决,Linux中文乱码如何解决
  10. 穿越火线好友服务器不稳定,穿越火线合区后新危机,玩家:卡顿掉帧没法玩