作者: lxponline
查看: 3797|回复: 5
打印 上一主题 下一主题

[教程] 【内存控制】应用程序占用内存较大解决方法整理

[复制链接]
跳转到指定楼层
楼主
lxponline 发表于 2015-6-8 09:50:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
查看: 3797|回复: 5
管理增加:
建议在决定使用之前确认程序类型,例如某些程序会加载大量的资源,比如游戏地图,可以选择切换地图时执行该函数对内存进行释放(移动至页面文件),在使用时系统会进行数据交换。
即:尽可能的减少非常用资源的内存占用
附录:
https://msdn.microsoft.com/en-us/library/ms686234(VS.85).aspx
http://blog.csdn.net/zlt982001/article/details/466879

说明:
.NET 一直所为人诟病的就是“胃口太大”,狂吃内存,虽然微软声称 GC 的功能和智能化都很高,但是内存的回收问题,一直存在困扰,尤其是 winform 程序,其主要原因是因为.NET程序在启动时,是需要由JIT动态编译并加载的,这个加载会把所有需要的资源都加载进来,很多资源是只有启动时才用的。
以XP 系统为例子,程序启动后,打开任务管理器,会看到占用的内存量比较大,你把程序最小化,会发现该程序占用的内存迅速减小到一个很小的值,再恢复你的程序,你会发现内存占用又上升了,但是比你刚启动时的内存占用值还是小的,这就是一个资源优化的过程,这个过程是操作系统主动完成的。

结论与展望:
创新设计大赛的项目已经快到交付的日期了,
都说Winform占用内存大,于是想着看看自己写的基于手机邮件的远程关机软件(Mail_Based_Remote_Shutdown)占用内存情况,
整个开发过程自己也在尽量写一些比较优美的代码来减少系统内存占用,今天看了下,刚打开时占用20M内存,
然后一点点增加,最后到80多M,真是无法忍受,
每次都是写了之后回过头来才发现自己的代码很丑,系统架构师的作用就体现出来了。

这里整理了一些网上关于Winform如何降低系统内存占用的资料,供参考,待更新:
  • 使用性能测试工具dotTrace 3.0,它能够计算出你程序中那些代码占用内存较多
  • 强制垃圾回收
  • 多dispose,close
  • 用timer,每几秒钟调用:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle,-1, -1);具体见附录。
  • 发布的时候选择Release
  • 注意代码编写时少产生垃圾,比如String + String就会产生大量的垃圾,可以用StringBuffer.Append
  • this.Dispose();   this.Dispose(True);   this.Close();   GC.Collect();
  • 注意变量的作用域,具体说某个变量如果只是临时使用就不要定义成成员变量。GC是根据关系网去回收资源的。
  • 检测是否存在内存泄漏的情况,详情可参见:内存泄漏百度百科


附录:定期清理执行垃圾回收代码:
//在程序中用一个计时器,每隔几秒钟调用一次该函数,打开任务管理器,你会有惊奇的发现
[C#] 纯文本查看 复制代码
#region 内存回收
[DllImport("kernel32.dll",EntryPoint = "SetProcessWorkingSetSize")]
public static extern intSetProcessWorkingSetSize(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



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 转播转播
回复 论坛版权

使用道具 举报

来自 3#
小红帽 发表于 2015-6-8 12:41:51 | 只看该作者
注意:SetProcessWorkingSetSize不是释放内存,只是将内存数据压入虚拟内存,不要搞错了,而且系统也会自动调整当前内存占用的,将暂时不用的数据压入到虚拟内存里
沙发
haode 发表于 2015-6-8 10:59:15 | 只看该作者
沙发 感谢楼主分享经验 赞一个
地板
xiaobo 发表于 2015-6-8 16:20:40 | 只看该作者
小红帽 发表于 2015-6-8 12:41
注意:SetProcessWorkingSetSize不是释放内存,只是将内存数据压入虚拟内存,不要搞错了,而且系统也会自动 ...

不恰当的使用会降低系统的性能
导致内存与硬盘交换数据频繁.


.Net中的GC机制在正常情况下,是可以信赖的,前提是代码规范


编辑了下LZ的帖子,希望不要介意
5#
duwenjie15 发表于 2015-6-9 13:27:11 | 只看该作者
正确的减少内存占用的方法是减少对象数量,比如一个class 中有  20个  String , 你可以把这3个 String 转换为  Byte[] 存贮在一起.比如 千万级数据的  ListView 你应该使用虚模式 ,实时生成ListViewItem。采用内存映射访问.大文件 而不是一次加载到内存中...

评分

参与人数 1威望 +1 金钱 +5 收起 理由
xiaobo + 1 + 5 赞一个!

查看全部评分

6#
jevan 发表于 2015-6-30 13:29:17 | 只看该作者
进来学习了一下.应该不用加这个的吧
您需要登录后才可以回帖 登录 | 加入CSkin博客

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|CSkin ( 粤ICP备13070794号

Powered by Discuz! X3.2  © 2001-2013 Comsenz Inc.  Designed by ARTERY.cn
GMT+8, 2024-4-27 12:44, Processed in 0.602990 second(s), 32 queries , Gzip On.

快速回复 返回顶部 返回列表