本文链接:http://blog.csdn.net/yokeqi/article/details/41083939

C#相比其他语言,拥有强大的垃圾回收机制,但并不是这样,你就可以对内存管理放任不管,其实在稍不注意的时候,可能就造成了内存泄露,甚至因此程序崩溃。

以下是遇到过的内存优化-内存泄露的问题与应对方案。

场景:

1. Form.ShowDialog()问题。

private void button1_Click(object sender, EventArgs e)
{
new Form2.ShowDialog();
}
如果你觉得写这样的一段代码很Cool,很简洁,你在项目也有这么写代码,那你就碰到大麻烦了,你试试在Form2中开个大一点的数组来检查内存,然后运行,按几下button1按钮,你就会发现,内存一直增加,即使你调用GC也无济于事。

2. 窗体向全局性事件注册了事件的问题。

public Form2()
{
InitializeComponent();
MyApp.FormChanged += FormChanged;
}
MyApp是一个静态类,如果向这种类里面注册了事件,而又没有取消注册,这样也会遇到大麻烦。即使在外部已经记得调用了Form2实例的Dispose也是没用的。

实际上由于各个开发人员的水平跟接触面不同,又没有经过统一的培训(各个人对内存释放的理解与关注度不同,或者写代码时就没考虑内存未被释放这种问题),发现问题的时候项目往往已经做到了一个阶段(SIT测试),系统也比较庞大了,这种时候才发现内存泄露的问题确实是很头疼的。

解决方案:

1. 基于架构师的经验,或者统一意见会议,在开发前对开发人员进行必要的统一培训,对关系到性能、内存等会影响系统稳定性的解决方案进行培训。这本身既有助于开发人员水平的提高,也对系统的稳定性方面提供很大的保障(项目可不是做完一个就没了,这种培训会带来长久的增益效果)。

2. 注意托管资源与非托管资源的释放区别,非托管资源是需要手动释放的。

3. 使用using关键字,避免忘记Dispose的情况,如上面的ShowDialog问题。(using中还起到了try-catch的作用,避免由于异常未调用Dispose的情况)

4. 使用UnLoad事件或者析构函数,对注册的全局事件进行取消注册。

5. 特别注意自定义组件的稳定性更重要,发生问题时影响也更广。注意继承IDisposable接口,进行资源释放,并且对有疑问/复杂逻辑的地方添加try-catch语句。(发现问题的人员不一定有权限修改这些组件)一定要保证组件健壮健壮,再健壮。这是我做组件的感悟~~~多么痛的领悟!!

最后特别奉送一个"内存释放"的大招:

调用这个API能让你的内存一下爆减:贴一段网上的示例代码

[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)
{
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}
是不是很给力,一调用内存就降下来。先别高兴太早,这其实是伪释放,只为暂时解决内存大量泄露导致系统崩溃而急需解决的情况。
具体原因:http://blog.sina.com.cn/s/blog_49f8960e0100081x.html,关键字:将物理内存转到虚拟内存,涉及磁盘读写。
好处坏处都贴出来了,是否需要使用请君自己斟酌。
---------------------
作者:笨蛋的天赋
来源:CSDN
原文:https://blog.csdn.net/yokeqi/article/details/41083939
版权声明:本文为博主原创文章,转载请附上博文链接!

C#内存泄露与资源释放 经验总结相关推荐

  1. windows 内存泄露和资源泄漏调试

    AQTime (有x64.win32的)进行内存泄露和资源泄漏监控 http://wenku.baidu.com/view/9aa1c2afdd3383c4bb4cd2c1.html x64下载:ht ...

  2. 几种内存泄露检测工具的比较

    概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的.复杂的应用程序中,内存泄漏是常见的问题.当以前分配的一片内存不再需要使用或无法访问时,但是却 ...

  3. 关于Android 的内存泄露及分析

    博客园 首页 新随笔 联系 管理 订阅 随笔- 137  文章- 6  评论- 145  关于Android 的内存泄露及分析 一. Android的内存机制 Android的程序由Java语言编写, ...

  4. Visual studio内存泄露检查工具--BoundsChecker

    BoundsChecker是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各种错误. BoundsChecker能检测的错误包括: 1)指针操作和内存.资源泄露错误,比如:内存泄露: ...

  5. #内存泄露# #valgrind# valgrind使用

    用法: valgrind [options] prog-and-args [options]: 常用选项,适用于所有Valgrind工具 -tool=<name> 最常用的选项.运行 va ...

  6. PJM软件数据结构分析(怎样有效地避免内存泄露)

    PJM 软件数据结构方面组织的还是不错的: typedef struct PjmsPktHeader { int msgcode;                /*!< 銉°儍銈汇兗銈搞偝銉笺 ...

  7. windows内存泄露定位方法

    windows内存泄露定位方法 内存泄露(Memory Leak)是C/C++程序经常遇到的一个棘手问题.简单来说,内存泄露就是没有释放本来应该释放的内存. 可以把解决内存泄露问题分成两步,第一步是定 ...

  8. 内存泄露解决记录——窗口资源释放

    前段时间在解决代码的内存泄露问题,解决了部分内存泄露问题. http://blog.csdn.net/enjolras/archive/2011/01/05/6117628.aspx 这篇文章起到了很 ...

  9. as3 Loader 加载资源后内存泄露无法释放的问题。

    as3 Loader 加载资源后内存泄露无法释放的问题. 本人用Loader加载外部一个swf.之后unloadAndStop,Flash概要分析发现,内存没有被释放. 网上搜了一大堆文章,要么就是加 ...

最新文章

  1. Windows和Linux的C/C++ IDE选择
  2. 为什么没有MMU的处理器无法安装操作系统?
  3. c++计算机等级考试笔记(1)
  4. MongoDB 性能瓶颈分析
  5. mysql 批量_mysql LOAD语句批量录入数据
  6. JAVA进阶教学之(源码及API文档概述)
  7. 爬楼梯(信息学奥赛一本通-T1204)
  8. 深入理解前端跨域问题的解决方案——前端面试
  9. 旅行商回溯算法C语言,【算法作业】用回溯法求解旅行商问题
  10. 转载:兼容IE的内阴影和外阴影效果
  11. 【生活相关】北京南苑机场接人
  12. Golang可能会踩的58个坑之中级篇
  13. 简述数字信号处理的内容和理论
  14. UEditor(集成 135 编辑器插件)(附源码)
  15. 只有黑社会才会说黑话
  16. python樱花开放教程_Python画樱花树 !
  17. 开关电源串模扼流圈、共模扼流圈选择方法
  18. 02、【江科大自化协stm32F103c8t6】笔记之【入门32单片机及EXTI外部中断初始化参数配置】
  19. 安装小觅相机(1030)驱动以及如何将Ubuntu18.04的内核降到4.15.0版本
  20. c语言 判断float无穷大,C++ 浮点数(double float)如何定义NaN 正无穷 负无穷,以及如何判断是否是NaN...

热门文章

  1. C++radix sort基数排序的实现算法之一(附完整源码)
  2. C++实现计数排序(附完整源码)
  3. C++STL的set/ multiset容器
  4. Android8.1 ifw方案,Android 8.1适配规范及常见问题处理方式
  5. springboot 直接转发调用_springboot-过滤器的页面跳转【重定向与请求转发】-异常报错...
  6. 「SVN」Linux下svn使用命令
  7. pandas中的sample方法
  8. 72.JVM参数设置(各种jvm参数)、分析;Total Heap;The Young Generation;
  9. ES分布式机制的透明性,垂直扩容和水平扩容,数据rebalance,master节点,节点平等的分布式架构,shard和replica机制(学习)
  10. 6.Maven聚合和继承,相关案例配置