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

这篇文章主要介绍了C# WinForm应用程序降低系统内存占用方法总结,本文总结了9个方法,同时给出了一个定期清理执行垃圾回收代码,需要的朋友可以参考下

背景:

微软的 .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-04 06:35:40

C# WinForm应用程序降低系统内存占用方法总结的相关文章

C# WinForm应用程序降低系统内存占用方法总结【转】

WinForm程序点用一直是个大问题,时间运行长了,越来越大,最近在网上发现个贴,试了上面方法,从进程来看,内存确实降下去了,效果还不错. 这里整理了一些网上关于Winform如何降低系统内存占用的资料,供参考: 1.使用性能测试工具dotTrace 3.0,它能够计算出你程序中那些代码占用内存较多2.强制垃圾回收3.多dispose,close4.用timer,每几秒钟调用:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle,

Linux系统内存占用90%以上 ?

问题: [[email protected] zx_epp_db]# free -m total used free shared buffers cached Mem: 15953 14706 1246 0 39 12687 -/+ buffers/cache: 1979 13973 Swap: 8015 27 7988 ---------------------------------------------------------------------------------------

降低Redis内存占用

1.降低redis内存占用的优点 1.有助于减少创建快照和加载快照所用的时间 2.提升载入AOF文件和重写AOF文件时的效率 3.缩短从服务器进行同步所需的时间 4.无需添加额外的硬件就可以让redis存贮更多的数据 回到顶部 2.短结构 Redis为列表.集合.散列.有序集合提供了一组配置选项,这些选项可以让redis以更节约的方式存储较短的结构. 回到顶部 2.1.ziplist压缩列表(列表.散列.有续集和) 通常情况下使用的存储方式 当列表.散列.有序集合的长度较短或者体积较小的时候,r

&lt;linux&gt;查看系统内存占用

1.查看内存情况 free -h 解释下基本概念 Mem 内存的使用信息Swap 交换空间的使用信息total 系统总的可用物理内存大小used 已被使用的物理内存大小free 还有多少物理内存可用shared 被共享使用的物理内存大小buff/cache 被 buffer 和 cache 使用的物理内存大小available 还可以被使用的物理内存大小(即系统可用内存约等于free+shared+buff/cache) 2.top查看内存占用,shift+m按MEN占用降序 top详解请参考:

yii2.0查询数据库降低内存占用方法

1.查询结果转化数组    (对象在内存中占有量比数组高 where()后面加->asArray() 把对象转换成数组) $results = Test::find()->where(['between','id',1,2])->all();     //打印结果是对象 $results = Test::find()->where(['between','id',1,2])->asArray()->all();   //打印结果是数组 2.批量查询    (循环查询,循

使用内存文件系统后系统内存统计方法

[问题描述] 在Linux系统中,内存可以分出一部分空间作为磁盘来使用,称为Ramdisk.这部分内存空间具有高速读写  www.ahlinux.com 特性,可以存储那些对磁盘IO要求较高的数据,显著的提升系统的服务性能. Ramdisk分为两种,一种是固定空间大小的空间,跟硬盘分区完全一样,可以格式化并挂载使用:一种是以 内存文件系统tmpfs的形式出现,可以根据需要扩充和缩小.这两种使用方式在kernel 2.4之后都得到了支 持. 在使用tmpfs时,因为不是一次分配,且对内存分配的形式

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

原文:http://www.jb51.net/article/56682.htm 背景: 微软的 .NET FRAMEWORK 现在可谓如火如荼了.但是,.NET 一直所为人诟病的就是“胃口太大”,狂吃内存,虽然微软声称 GC 的功能和智能化都很高,但是内存的回收问题,一直存在困扰,尤其是 winform 程序,其主要原因是因为.NET程序在启动时,是需要由JIT动态编译并加载的,这个加载会把所有需要的资源都加载进来,很多资源是只有启动时才用的. 以XP 系统为例子,程序启动后,打开任务管理器,

了解 JavaScript 应用程序中的内存泄漏

简介 当处理 JavaScript 这样的脚本语言时,很容易忘记每个对象.类.字符串.数字和方法都需要分配和保留内存.语言和运行时的垃圾回收器隐藏了内存分配和释放的具体细节. 许多功能无需考虑内存管理即可实现,但却忽略了它可能在程序中带来重大的问题.不当清理的对象可能会存在比预期要长得多的时间.这些对象继续响应事件和消耗资源.它们可强制浏览器从一个虚拟磁盘驱动器分配内存页,这显著影响了计算机的速度(在极端的情形中,会导致浏览器崩溃). 内存泄漏指任何对象在您不再拥有或需要它之后仍然存在.在最近几

Android 中对于图片的内存优化方法

Android 中对于图片的内存优化方法,需要的朋友可以参考一下 1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource. BitmapFactory.decodeResource 来设置一张大图,因为这些方法在完成 decode 后,最终都是通过 Java 层的 createBitmap 来完成的,需要消耗更多内存.因此,改用先通过 BitmapFactory.decodeStream 方法,创建出一个 bitmap,再将其设为 ImageVie