C#内存泄露与资源释放 经验总结
本文链接: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#内存泄露与资源释放 经验总结相关推荐
- windows 内存泄露和资源泄漏调试
AQTime (有x64.win32的)进行内存泄露和资源泄漏监控 http://wenku.baidu.com/view/9aa1c2afdd3383c4bb4cd2c1.html x64下载:ht ...
- 几种内存泄露检测工具的比较
概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的.复杂的应用程序中,内存泄漏是常见的问题.当以前分配的一片内存不再需要使用或无法访问时,但是却 ...
- 关于Android 的内存泄露及分析
博客园 首页 新随笔 联系 管理 订阅 随笔- 137 文章- 6 评论- 145 关于Android 的内存泄露及分析 一. Android的内存机制 Android的程序由Java语言编写, ...
- Visual studio内存泄露检查工具--BoundsChecker
BoundsChecker是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各种错误. BoundsChecker能检测的错误包括: 1)指针操作和内存.资源泄露错误,比如:内存泄露: ...
- #内存泄露# #valgrind# valgrind使用
用法: valgrind [options] prog-and-args [options]: 常用选项,适用于所有Valgrind工具 -tool=<name> 最常用的选项.运行 va ...
- PJM软件数据结构分析(怎样有效地避免内存泄露)
PJM 软件数据结构方面组织的还是不错的: typedef struct PjmsPktHeader { int msgcode; /*!< 銉°儍銈汇兗銈搞偝銉笺 ...
- windows内存泄露定位方法
windows内存泄露定位方法 内存泄露(Memory Leak)是C/C++程序经常遇到的一个棘手问题.简单来说,内存泄露就是没有释放本来应该释放的内存. 可以把解决内存泄露问题分成两步,第一步是定 ...
- 内存泄露解决记录——窗口资源释放
前段时间在解决代码的内存泄露问题,解决了部分内存泄露问题. http://blog.csdn.net/enjolras/archive/2011/01/05/6117628.aspx 这篇文章起到了很 ...
- as3 Loader 加载资源后内存泄露无法释放的问题。
as3 Loader 加载资源后内存泄露无法释放的问题. 本人用Loader加载外部一个swf.之后unloadAndStop,Flash概要分析发现,内存没有被释放. 网上搜了一大堆文章,要么就是加 ...
最新文章
- Windows和Linux的C/C++ IDE选择
- 为什么没有MMU的处理器无法安装操作系统?
- c++计算机等级考试笔记(1)
- MongoDB 性能瓶颈分析
- mysql 批量_mysql LOAD语句批量录入数据
- JAVA进阶教学之(源码及API文档概述)
- 爬楼梯(信息学奥赛一本通-T1204)
- 深入理解前端跨域问题的解决方案——前端面试
- 旅行商回溯算法C语言,【算法作业】用回溯法求解旅行商问题
- 转载:兼容IE的内阴影和外阴影效果
- 【生活相关】北京南苑机场接人
- Golang可能会踩的58个坑之中级篇
- 简述数字信号处理的内容和理论
- UEditor(集成 135 编辑器插件)(附源码)
- 只有黑社会才会说黑话
- python樱花开放教程_Python画樱花树 !
- 开关电源串模扼流圈、共模扼流圈选择方法
- 02、【江科大自化协stm32F103c8t6】笔记之【入门32单片机及EXTI外部中断初始化参数配置】
- 安装小觅相机(1030)驱动以及如何将Ubuntu18.04的内核降到4.15.0版本
- c语言 判断float无穷大,C++ 浮点数(double float)如何定义NaN 正无穷 负无穷,以及如何判断是否是NaN...
热门文章
- C++radix sort基数排序的实现算法之一(附完整源码)
- C++实现计数排序(附完整源码)
- C++STL的set/ multiset容器
- Android8.1 ifw方案,Android 8.1适配规范及常见问题处理方式
- springboot 直接转发调用_springboot-过滤器的页面跳转【重定向与请求转发】-异常报错...
- 「SVN」Linux下svn使用命令
- pandas中的sample方法
- 72.JVM参数设置(各种jvm参数)、分析;Total Heap;The Young Generation;
- ES分布式机制的透明性,垂直扩容和水平扩容,数据rebalance,master节点,节点平等的分布式架构,shard和replica机制(学习)
- 6.Maven聚合和继承,相关案例配置