11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

处理.NET 中的内存泄露

  • 2009-11-09
  • 本文字数:1034 字

    阅读完需:约 3 分钟

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:154922
用户头像

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

关注

评论

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

SQL报了一个不常见的错误,让新来的实习生懵了

华为云开发者联盟

数据库 sql 程序员 后端 华为云

Docker 化 Vue2 应用开发

devpoint

Docker Docker 镜像 6月月更

新手向:前端程序员必学基本技能——调试JS代码

若川

JavaScript 前端 前端开发 调试 Node

在线文本按行批量反转工具

入门小站

工具

4种方法教你如何查看java对象所占内存大小

华为云开发者联盟

Java 开发 内存 代码

大促场景下,如何做好网关高可用防护

阿里巴巴云原生

阿里云 高可用 云原生 网关 高可用微服务

一套系统,减轻人流集中地10倍的通行压力

天天预约

人脸识别 考勤管理 设备接入 预约工具 疫情防控

Bit.Store:熊市漫漫,稳定Staking产品或成主旋律

石头财经

信通院举办“业务与应用安全发展论坛” 天翼云安全能力再获认可

Geek_2d6073

linux检测系统是否被入侵(上)

入门小站

Linux

Bit.Store:熊市漫漫,稳定Staking产品或成主旋律

小哈区块

数仓的字符截取三胞胎:substrb、substr、substring

华为云开发者联盟

数据库 后端 开发 华为云

企业架构师面试的100个问题

涛哥

企业架构师

Python每日一练——第1天:水仙花数

🧸漫月柒七

大数据性能提升28%!阿里云新一代本地SSD实例i4开放公测

阿里云弹性计算

大数据 io SSD NoSQL 数据库

有关 Java 9 的 String

HoneyMoose

熊市慢慢,Bit.Store提供稳定Staking产品助你穿越牛熊

BlockChain先知

带你认识图数据库性能和场景测试利器LDBC SNB

华为云开发者联盟

人工智能 华为云 图数据库

拥抱云原生:江苏移动订单中心实践

鲸品堂

云原生

可观测,才可靠:云上自动化运维CloudOps系列沙龙 第一弹

阿里云弹性计算

DevOps 可观测性 自动化运维 CloudOps

从科研创新到产业落地 华为发布人工智能大模型全流程使能体系

科技热闻

关于企业数字化的展望(38/100)

hackstoic

数字化

于文文、胡夏等明星带你玩转派对 皮皮APP点燃你的夏日

联营汇聚

Java 中的 String Pool 简介

HoneyMoose

每次新增页面复制粘贴?100多行源码的 element-ui 新增组件功能告诉你减少重复工作

若川

JavaScript Vue 前端 Element Element UI

Bit.Store:熊市漫漫,稳定Staking产品或成主旋律

西柚子

开箱即用!Linux 内核首个原生支持,让你的容器体验飞起来!| 龙蜥技术

阿里巴巴云原生

Linux 阿里云 容器 云原生

今晚战码先锋润和赛道第2期直播丨如何参与OpenHarmony代码贡献

OpenHarmony开发者社区

OpenHarmony

本周二晚19:00战码先锋第8期直播丨如何多方位参与OpenHarmony开源贡献

OpenHarmony开发者社区

OpenHarmony

在线JSON转PlainText工具

入门小站

工具

处理.NET中的内存泄露_.NET_Abel Avram_InfoQ精选文章