C#内存泄漏原因整理

一直以为C#不存在内存泄漏的问题,直到遇到一个程序运行一段时间后出现卡顿情况,才发现程序出现了内存泄漏问题。在网上看到了几篇文章,整理下C#内存泄露可能的原因,提醒自己以后开发时注意下,后续遇到其他情况再补充完善。

1.非托管资源(内存、控件等)

因为非托管资源所占的内存不能自动回收,所以使用后必须手动回收,否则程序运行多次很容易造成内存泄露。

// 完成托管平台到win32平台的转换
IntPtr lpInBuffer = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(param, lpInBuffer, false);
……
// 释放win32平台的内存资源
Marshal.FreeHGlobal(lpInBuffer);

在使用的函数开头写下using 就可以不用担心内存泄漏问题,简化复杂管理问题,异常,多return,continue,break,goto之类的跳转等。

using var xxx = new XXX();

如可以在 using 语句中声明对象:

using (Font font1 = new Font("Arial", 10.0f))
{
   // use font1
}

2.静态变量

静态变量中的成员所占的内存,如果不手动处理是不会释放内存的,单态模式的对象也是静态的,所以需要特别注意。因为静态对象中的成员所占的内存不会释放,如果此成员是以个对象,同时此对象中的成员所占的内存也不会释放,以此类推,如果此对象很复杂,而且是静态的就很容易造成内存泄露。

3.Dispose方法没被调用,或Dispose方法没有处理对象的释放。这样也会造成内存泄露

4.当一个查询语句查询出来的数据量很大,达到几百万条数据时存放到datatable 或dataset中也会造成内存溢出,这是可以采用分页查询等其他方法来解决。

5.未退订的事件

参考网页:

.NET资源泄露与处理方案

浅谈.net 内存泄露和内存溢出

8 Ways You can Cause Memory Leaks in .NET

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值