C# Winform应用程序占用内存较大解决方法整理
来源:互联网 发布:淘宝投诉不成立怎么办 编辑:程序博客网 时间:2024/05/21 10:38
微软的 .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
5、发布的时候选择Release
6、注意代码编写时少产生垃圾,比如String + String就会产生大量的垃圾,可以用StringBuffer.Append
7、this.Dispose();
8、注意变量的作用域,具体说某个变量如果只是临时使用就不要定义成成员变量。GC是根据关系网去回收资源的。
9、检测是否存在内存泄漏的情况,详情可参见:内存泄漏百度百科
附录:定期清理执行垃圾回收代码:
//在程序中用一个计时器,每隔几秒钟调用一次该函数,打开任务管理器,你会有惊奇的发现
#region 内存回收
[DllImport("kernel32.dll", EntryPoint= "SetProcessWorkingSetSize
public static extern int SetProcessWorkingSetSize
/// <summary>
/// 释放内存
/// </summary>
public static void ClearMemory()
{
GC.Collect();
GC.WaitForPendingFinalizers
if (Environment.OSVersion.Platform== PlatformID.Win32NT)
{
App.SetProcessWorkingSetSize
}
}
#endregion
- C# Winform应用程序占用内存较大解决方法整理
- C# Winform应用程序占用内存较大解决方法整理
- C# Winform应用程序占用内存较大解决方法整理
- C# Winform应用程序占用内存较大解决方法整理
- C# Winform应用程序占用内存较大解决方法整理
- C# Winform应用程序占用内存较大解决方法整理(转)
- C# Winform应用程序占用内存较大解决方法整理(转)
- C# Winform应用程序占用内存较大解决方法整理(转)
- C# Winform应用程序占用内存较大解决方法整理(转)-- SetProcessWorkingSetSize
- C# WinForm应用程序降低系统内存占用方法总结
- Windows 内存详解(六) C# WinForm应用程序降低系统内存占用方法总结
- C#中线程占用内存过大解决方法
- C#中线程占用内存过大解决方法
- C#中线程占用内存过大解决方法
- 降低Winform 内存占用
- 【转】有效减少WinForm程序的内存占用 C#
- VS2013 C++ 项目占用空间较大的解决方法
- C# WinForm CPU占用过高
- 一周讨论精华
- android findView 如何避免类型转换
- 转载一篇android内存泄漏的文章
- 详解 windows下 QT 4.7.3安装教程
- HDU 2156
- C# Winform应用程序占用内存较大解决方法整理
- android 如何控制Gallery 滑动速度
- 转:python模块学习 ---- smtplib 邮件发送
- 字段类型设计与实际业务不符引发的问题1
- ADB server didn't ACK * failed to start daemon * 解决方案
- UVa 10880 - Colin and Ryan
- AVR 工具指南(一)
- 为什么用栈,参数、局部变量入栈我怎么去访问的?
- JAVA类装载器classloader和命名空间namespace