热点推荐

查看: 366|回复: 2
收起左侧

[资料] C# WinForm应用程序降低系统内存占用方法总结

[复制链接]
  • TA的每日心情
    振奋
    5 天前
  • 签到天数: 535 天

    连续签到: 1 天

    [LV.9]以坛为家II

    347

    主题

    1287

    帖子

    6118

    积分

    Rank: 9

    积分
    6118

    突出贡献优秀版主荣誉管理论坛元老优质会员最佳新人

    发表于 2019-1-2 23:18:16 | 显示全部楼层 |阅读模式

    51Halcon诚邀您的加入,专注于机器视觉开发与应用技术,我们一直都在努力!

    您需要 登录 才可以下载或查看,没有帐号?会员注册

    x
    背景:

    微软的 .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、检测是否存在内存泄漏的情况,详情可参见:内存泄漏百度百科

    附录:定期清理执行垃圾回收代码:
    1. //在程序中用一个计时器,每隔几秒钟调用一次该函数,打开任务管理器,你会有惊奇的发现

    2. #region 内存回收
    3. [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
    4. public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
    5. /// <summary>
    6. /// 释放内存
    7. /// </summary>
    8. public static void ClearMemory()
    9. {
    10. GC.Collect();
    11. GC.WaitForPendingFinalizers();
    12. if (Environment.OSVersion.Platform == PlatformID.Win32NT)
    13. {
    14. App.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
    15. }
    16. }
    17. #endregion
    复制代码


    转载自:https://www.jb51.net/article/56682.htm
    无效附件更新 权限提升操作 删帖申请 举报以及其他需要帮助请加入QQ群:214663141 广告位招商 有意者联系
    面向企业销售智能软件带相机和镜头,仅需3500,来电咨询 15019223858  18520862540
  • TA的每日心情
    点赞
    4 天前
  • 签到天数: 371 天

    连续签到: 1 天

    [LV.9]以坛为家II

    0

    主题

    55

    帖子

    916

    积分

    Rank: 3

    积分
    916

    活跃会员

    发表于 2019-1-3 09:30:59 | 显示全部楼层
    楼主说的没错 定义变量使用后一定要收回
    字符串尽量少用string+string  可以使用StringBuffer

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

    您需要登录后才可以回帖 会员登录 | 会员注册

    本版积分规则

    经营性网站备案信息 经营性网站
    备案信息

    中国互联网举报中心 中国互联网
    举报中心

    中国文明网传播文明 中国文明网
    传播文明

    诚信网站

    深圳市市场监督管理局企业主体身份公示 工商网监
    电子标识