GMTC全球大前端技术大会(北京站)门票9折特惠截至本周五,点击立减¥480 了解详情
写点什么

处理.NET 中的内存泄露

2009 年 11 月 09 日

Fabrice Marguerie 是一位软件架构师和咨询师,他在 MSDN 发表了如何检测和避免.NET 程序内存与资源泄漏的文章。此文章描述了编写.NET 程序时可能发生的内存与资源泄漏,以及如何避免这些泄漏。

C#这样的编程语言使用垃圾收集器来清理内存,对于程序完全不会再访问的内存,本应是没有内存泄漏的。Fabrice 称,内存泄漏发生在一块内存不 再被使用,但却依然被程序所引用时。当一块内存无法被程序访问到时,垃圾收集器将会重新分配这块内存,但是如果程序仍然保持对内存的引用却不使用这块内存 时,就会造成内存泄漏。

Fabrice 还列举了一些可能泄漏的系统资源:

  • The system uses User objects to support window management. They include: Accelerator tables, Carets, Cursors, Hooks, Icons, Menus and Windows.
  • 用于窗口管理的用户对象,包括快捷键表、符号、光标、钩子、图标、菜单和窗口。
  • 用于图形的GDI 对象:位图、画刷、设备环境(DC)、字体、内存 DC、元文件、调色板、画笔、区域等。
  • 用于内存管理、进程执行和进程间通信(IPC) 的Kernel 对象:文件、进程、线程、信号、定时器、访问令牌、套接字等。

这些资源都是有限制的,注册表中的 GDIProcessHandleQuota 和 USERProcessHandleQuota 键保存了单个进程可用的最大 GDI 对象和用户对象数量,默认值是 10000。虽然这个数字对于大多数程序足 够了,但如果使用的过多则可能会达到另一个限制,一个 Windows session 最多只能有 65536 个句柄。Fabrice这个限制很容易就会达到。他的结论是,要小心使用和释放系统资源。

Fabrice 列举了一些内存泄漏的根本原因,以及是如何造成泄漏的:

  • 使用静态引用
  • 未退订的事件-作者认为这是最常见的内存泄漏原因
  • 未退订的静态事件
  • 未调用 Dispose 方法
  • 使用不彻底的 Dispose 方法
  • 在 Windows Forms 中对 BindingSource 的误用
  • 未在 WorkItem/CAB 上调用 Remove

作者在文章中还提供了一些避免内存泄漏的建议:

  • 对象的创建者或拥有者负责销毁对象,而不是使用者
  • 当不再需要一个事件订阅者时退订此事件,为确保安全可以在 Dispose 方法中退订
  • 当对象不再触发事件时,应该将对象设为 null 来移除所有的事件订阅者
  • 当模型和视图引用同一个对象时,推荐给视图传递一个此对象的克隆,以防止无法追踪谁在使用哪个对象
  • 对系统资源的访问应该包装在 using 块中,这将在代码执行后强制执行 Dispose

Fabrice 最后介绍了一些工具来对付泄漏: GDILeaks (EXE)、 dotTrace .NET Memory Profiler SOS.dll WinDbg

查看英文原文: Dealing with Memory Leaks in .NET

2009 年 11 月 09 日 21:154714
用户头像

发布了 63 篇内容, 共 20.6 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容

第3周 代码重构:代码重构能力是架构师最基本的能力

陆不得

设计模式

丿淡忘

单例模式 极客大学架构师训练营 组合模式

面向对象设计模式课程作业

Tech Guy

极客大学架构师训练营

架构师训练营-第三周-作业

狂奔嘀兔纸

极客大学架构师训练营

第三周作业

倪惠华

架构师训练营 - 第三周作业

kk

第三周总结

丿淡忘

极客大学架构师训练营

面向对象编程

Arthur

模式和重构-学习心得

蒜泥精英

设计模式总结(golang版)

2流程序员

架构师训练营-第三章-作业

而立

极客大学架构师训练营

第三周学习总结

CP

week3 作业二

任鑫

架构课第三周课后作业

张瑞浩

第三周设计模式总结

石刻掌纹

架构师训练营第三周总结

W_T

单例与组合模式代码实现

Lane

极客大学架构师训练营

作业-组合模式和单例模式

蒜泥精英

聊聊设计模式——上篇

Jerry Tse

随笔 极客大学架构师训练营 作业 23种设计模式

极客时间第 0 期架构师训练营第三周作业

2流程序员

架构师训练营-作业3

紫极

第三周作业-命题作业

molly

极客大学架构师训练营

架构师训练营 - 学习笔记 - 第三周

小遵

乘风破浪的5G,与隐藏在深海的EMC暗礁

脑极体

week03作业

Safufu

架构师训练营第三周作业

Jerry Tse

极客大学架构师训练营 作业

设计模式学习实践

倪惠华

架构师训练营第3周作业

aoeiuvzcs

架构师训练营 第三周 个人感想

且听且吟

第三周作业

毛叫

极客大学架构师训练营

程序员的晚餐 | 6 月 24 日 微甜的毛豆

清远

美食

处理.NET中的内存泄露-InfoQ