C# Dispose Finalize

  比较值得参考的文档:http://www.jb51.net/article/37214.htm

.NET 的内存管理过程:

  托管堆假设内存无限大,线性连续分配内存;

  实际内存不够使用时,遍历托管堆对资源,对过期资源进行标记;

  移除被标记的资源后对托管堆进行压缩(重新从头开始排列),调整堆指针到空闲内存的开头;

另:

  垃圾回收主要且微软推荐让CLR自己进行,不建议用 GC.Collect 指令;

  要自己负责非托管资源的回收:

  • Finalize:在 Finalize 内对非托管资源进行回收,以确保 CLR 在内存回收时调用 Finalize 回收非托管资源;
  • Dispose:提供一个显式的接口,使用Dispose的主要动机在于与 using 的配合,编译器会自动为 using 生成 try.finally 块,编译器会为 using 中的变量转型成 IDispose 并在 finally 调用 Dispose;

  

  

  

时间: 2024-08-26 00:25:14

C# Dispose Finalize的相关文章

C#学习笔记---Dispose(),Finalize(),SuppressFinalize

http://www.cnblogs.com/eddyshn/archive/2009/08/19/1549961.html 在.NET的对象中实际上有两个用于释放资源的函数:Dispose和Finalize.Finalize的目的是用于释放非托管的资源,而Dispose是用于释放所有资源,包括托管的和非托管的. 在这个模式中,void Dispose(bool disposing)函数通过一个disposing参数来区别当前是否是被Dispose()调用.如果是被Dispose()调用,那么需

C#中Dispose,finalize,GC,析构函数区别(转)

释放类所使用的未托管资源的两种方式:         1.利用运行库强制执行的析构函数,但析构函数的执行是不确定的,而且,由于垃圾收集器的工作方式,它会给运行库增加不可接受的系统开销.         2.IDisposable接口提供了一种机制,允许类的用户控制释放资源的时间,但需要确保执行Dispose(). 一般情况下,最好的方法是执行这两种机制,获得这两种机制的优点,克服其缺点.假定大多数程序员都能正确调用Dispose(),实现IDisposable接口,同时把析构函数作为一种安全的机

Delphi的分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同

转载自:http://www.cnblogs.com/qiusl/p/4028437.html?utm_source=tuicool 我估摸者内存分配+释放是个基础的函数,有些人可能没注意此类函数或细究,但我觉得还是弄明白好. 介绍下面内存函数之前,先说一下MM的一些过程,如不关心课忽略: TMemoryManger = record GetMem: function(Size: Integer): Pointer; FreeMem: function(P: Pointer): Integer;

delphi.memory.分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同

来自:http://www.cnblogs.com/qiusl/p/4028437.html ------------------------------------------------------------------ 我估摸着内存分配+释放是个基础函数,有些人可能没注意此类函数或细究,但我觉得还是弄明白的好. 介绍下面内存函数前,先说一下MM的一些过程,如不关心可忽略: TMemoryManager = record GetMem: function(Size: Integer): P

delphi.memory.分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同,内存分配函数

来自:http://www.cnblogs.com/qiusl/p/4028437.html?utm_source=tuicool&utm_medium=referral -------------------------------------------------------------------------------------------------------- 我估摸着内存分配+释放是个基础函数,有些人可能没注意此类函数或细究,但我觉得还是弄明白的好. 介绍下面内存函数前,先说

黑马公开课——运行原理与GC学习笔记

.NET Framework 程序的运行原理 .NET Framework的组成:(1)基础类库(BCL):使用线程的类来完成编程,对于不存在的类,就自己编写:(2)编译工具:将源文件,编译成"程序集"(exe或dll等)[.NET环境中,MSIL=CIL=IL](3)公共语言运行时(CLR):执行前检测.编译:执行到了某个方法时才编译这个方法的代码[即时编译器(JIT)]编译过程:.NET源代码(C#)-->通过C#编译器编译成程序集[程序集中包括:元数据(一个表,显示了程序中

第21章 自动内存管理 21.1-21.7

本章将讨论托管应用程序如何构造新对象,托管堆如何控制这些对象的生存期,以及如何回收这些对象的内存.简单的说,本章要解释CLR中的垃圾回收器是如何工作的,还要解释与它有关的性能问题. 21.1理解垃圾回收平台的基本工作原理 在.NET Framework中,内存中的资源(即所有二进制信息的集合)分为“托管资源”和“非托管资源”.托管资源必须接受.NET Framework的CLR的管理 (如内存类型安全性检查) .而非托管资源则不必接受.NET Framework的CLR管理, 需要手动清理垃圾(

.net垃圾收集机制【转】

在.NET Framework中,内存中的资源(即所有二进制信息的集合)分为"托管资源"和"非托管资源".托管资源必须接受.NET Framework的CLR(通用语言运行时)的管理(诸如内存类型安全性检查),而非托管资源则不必接受.NET Framework的CLR管理. (了解更多区别请参阅.NET Framework或C#的高级编程资料) 托管资源在.NET Framework中又分别存放在两种地方: "堆栈"和"托管堆"

Atitit.软件开发提升稳定性总结

#----影响稳定性几个类别 3 1. 资源和内存泄漏溢出 3 2. 数据库/文件死锁 3 3. 类库冲突 3 4. 热更新热部署(业务可用性 3 5. 程序崩溃 3 6. 磁盘空间/cpu/内存占用过高 3 #-----影响稳定性的因素 3 7. 内存泄漏溢出 3 8. 数据库连接泄漏 3 9. 数据库死锁 3 10. 类库冲突,造成部署问题 4 11. 热更新的支持不足,部署比較麻烦 4 12. Web服务跟数据库服务崩溃 4 13. 非托管资源的释放 4 14. 其它的潜在隐患: 4 15