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

原文:http://www.jb51.net/article/56682.htm

背景:

微软的 .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

 

 

时间: 2024-10-21 22:10:25

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

Mac pro显示应用程序占用内存很高解决方法

  这是Mac自带的system information.app (About this mac). 机制 当我们在点击存储这个按钮时,Mac后台会通过spotlight的功能进行对audio,movie,apPS这些 属性的文件进行统计. spotlight的背后是通过mac的一套metadata的机制进行索引的,metadata可以理解成对整个文件系统做了一个快速的分类和元数据index,就像字典目录一样,可以感受一下,这些元数据存储在根目录. mac对整个metadata进行了规范,可以通

win8.1系统没声音且audiodg.exe进程占用内存高的解决方法

  在win8系统下,用户在启用游戏或聊天软件时,却发现系统没有声音的问题,用户在对任务管理器进行查看时,却发现audiodg.exe音频设备图形隔离进程占用大量内存,有时甚至会占用到100%,造成应用程序时区响应的问题,对于这一问题我们如何解决呢?下面看小编为您提供的解决操作方法吧! 原因分析: 这是Win7和Win8.1都存在的一个问题,在开机后首次播放音频.插入USB设备时,audiodg.exe都会扫描C:WindowsSystem32catroot{F750E6C3-38EE-11D1

w3wp.exe进程占用内存过高解决方法_win服务器

w3wp.exe是在IIS(因特网信息服务器)与应用程序池相关联的一个进程,如果你有多个应用程序池,就会有对应的多个w3wp.exe的进程实例运行.这个进程用来分配大量的系统资 今天研究了一下,可以做以下配置: 1.在IIS中对每个网站进行单独的应用程序池配置.即互相之间不影响. 2.设置应用程序池的回收时间,默认为1720小时,可以根据情况修改.同时,设置同时运行的w3wp进程数目为1.再设置当内存或者cpu占用超过多少,就自动回收内存 一般来说,这样就可以解决了.但仍然会出现个别网站因为程序

解决WebBrowser控件会导致应用程序占用内存居高不下问题

今天发现刚写的WinForm应用程序占用内存不正常,经分析测试发现是由于多次创建WebBrowser控件导致,为了便于说明问题,下边是简化后的代码: Form1.cs:   public partial class Form1 : Form {     public Form1()     {         InitializeComponent();     }     private void button1_Click(object sender, EventArgs e)     {

Unity3D占用内存太大的解决方法

最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时 动态加载,可以指定路径和来源的. 其实场景里所有静态的对象也有这么一个加载过程,只是Unity3D后台替你

Android程序占用内存过多会导致界面卡顿吗?

问题描述 公司的程序有一个界面非常卡顿,现在需要我做界面流畅度的优化.经我测试,我把卡顿的这个Activity里面的全局变量全部删除了,布局文件也换成非常简洁的界面,竟然依然很卡.于是我怀疑,是不是因为程序中的全局变量太多,再加上代码写的不太严谨而造成一些内存泄露,这两点原因导致软件占用内存过大,而造成界面卡顿? 希望得到大家的回复:界面卡顿的原因除了界面过于复杂,是否还有我说的这个原因?先谢谢大家了! 解决方案 装到手机上后用系统辅助工具查看下软件占用的内存,然后针对代码做单元测试,优化解决方

内存泄露-vc开发的程序占用内存一直在增大,是什么原因导致的?

问题描述 vc开发的程序占用内存一直在增大,是什么原因导致的? vc开发的程序占用内存一直在增大,是什么原因导致的?用bound checker也没检测到内存泄露啊,只是软件变得很卡. 解决方案 内存泄露只是没释放就直接放弃引用.也可能你一直引用着但是不再实际使用,这个是工具检查不出来的. 还是代码问题啊. 解决方案二: 你的程序有内存泄漏,多检查你的代码分配堆的地方 还有可能有其他资源泄漏.比如句柄,等 解决方案三: 1.你的程序应该是服务性程序吧,一直在运行: 2.检查自己检查代码,或者用内

360浏览器占用内存过高解决办法

  说到360安全浏览器,很多人都是又爱又恨,一方面方便,另一方面有老是提醒内存占用过高,小编也是经常遇到,解决的方法网上有很多,不过我自己试了试,都是治标不治本的,下面为大家分析一下问题原因以及360浏览器占用内存过高解决办法. 360浏览器占用内存过高 内存过高原因分析: 在360浏览器3.x的多进程的框架下,内存占用比单进程高,但是优点是能在网页关闭之后完全释放网页占用的资源.在360浏览器3.x的混合进程的框架下,内存占用比单进程较高,但是优点是能在网页关闭之后较好释放网页占用的资源.

win7系统QQexternal.exe进程占用内存空间的删除方法

  win7系统QQexternal.exe进程占用内存空间的删除方法          具体步骤: 1.在Win7里按"Ctrl+Shift+Esc "快速打开任务管理器(XP的快捷键为Ctrl+Alt+Delete),然后在进程那里找到QQexternal.exe后点击右键选择"打开文件位置"; 2.直接删掉QQexternal.exe; 3.直接删掉QQexternal.exe; 4.如果删除QQexternal.exe失败证明你还没关闭QQ; 5.马上退出Q