托管资源和非托管资源

转载 2011年01月24日 16:17:00

在.net 编程环境中,系统的资源分为托管资源和非托管资源。

  对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的

只是了解.net CLR如何做这些操作。也就是说对于您的应用程序创建的大多数对象,可以依靠 .NET

Framework 的垃圾回收器隐式地执行所有必要的内存管理任务。

  对于非托管资源,您在应用程序中使用完这些非托管资源之后,必须显示的释放他们,例如

System.IO.StreamReader的一个文件对象,必须显示的调用对象的Close()方法关闭它,否则会占用系统

的内存和资源,而且可能会出现意想不到的错误。

  我想说到这里,一定要清楚什么是托管资源,什么是非托管资源了?

  最常见的一类非托管资源就是包装操作系统资源的对象,例如文件,窗口或网络连接,对于这类资源

虽然垃圾回收器可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。还好.net

Framework提供了Finalize()方法,它允许在垃圾回收器回收该类资源时,适当的清理非托管资源。如果

在MSDN Library 中搜索Finalize将会发现很多类似的主题,这里列举几种常见的非托管资源:

ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Fon

t,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen,Regex,Socket,StreamWriter,Time

r,Tooltip 等等资源。可能在使用的时候很多都没有注意到!

关于托管资源,就不用说了撒,像简单的int,string,float,DateTime等等,.net中超过80%的资源都是托

管资源。

非托管资源如何释放,.NET Framework 提供 Object.Finalize 方法,它允许对象在垃圾回收器回收该对

象使用的内存时适当清理其非托管资源。默认情况下,Finalize 方法不执行任何操作。默认情况下,

Finalize 方法不执行任何操作。如果您要让垃圾回收器在回收对象的内存之前对对象执行清理操作,您

必须在类中重写 Finalize 方法。然而大家都可以发现在实际的编程中根本无法override方法Finalize

(),在C#中,可以通过析构函数自动生成 Finalize 方法和对基类的 Finalize 方法的调用。

例如:
~MyClass()
{
  // Perform some cleanup operations here.
}
  该代码隐式翻译为下面的代码。
protected override void Finalize()
{
  try
  {
    // Perform some cleanup operations here.
  }
  finally
  {
    base.Finalize();
  }
}

但是,在编程中,并不建议进行override方法Finalize(),因为,实现 Finalize 方法或析构函数对性能

可能会有负面影响。一个简单的理由如下:用 Finalize 方法回收对象使用的内存需要至少两次垃圾回收

,当垃圾回收器回收时,它只回收没有终结器(Finalize方法)的不可访问的内存,这时他不能回收具有终

结器(Finalize方法)的不可以访问的内存。它改为将这些对象的项从终止队列中移除并将他们放置在标记

为“准备终止”的对象列表中,该列表中的项指向托管堆中准备被调用其终止代码的对象,下次垃圾回收

器进行回收时,就回收并释放了这些内存。

使用using清理非托管资源

我们都知道,垃圾回收可以分为Dispose和Finalize两类,关于这两者的区别已经太多了,一个是正常的垃圾回收GC所调用的方法,另外一个是终结器Finalizer,所调用的方法,在Effectiv...
  • hi_dzj
  • hi_dzj
  • 2012年01月01日 12:45
  • 422

非托管资源内存泄露调测

项目中某一识别引擎在并发720Vuser持续压测2d后挂起, 控制台窗口报错“System.OutOfMemoryException.Exception” 原因分析: VSServer发生...

CLR内存管理之释放非托管资源

上篇文章中我提到,CLR通过栈指针给变量分配内存空间,通过GC来释放不再引用的内存空间。GC虽然减少了程序员处理内存的困难,但它也有局限性,它不能处理像文件句柄、网络连接、数据库连接这样的非托管资源。...
  • vLinker
  • vLinker
  • 2015年03月10日 10:29
  • 376

c#中的非托管资源释放 (Finalize和Dispose)

在了解Finalize和Dispose之前,我们需要了解两个概念,一个是托管资源,一个非委托资源。a.其中托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,例如程序中分配的对象...

C#高级编程七十四天----释放非托管资源

释放非托管资源 在介绍释放非托管资源的时候,我觉得有必要先来认识一下啥叫非托管资源,既然有非托管资源,肯定有托管资源.     托管资源指的是.net可以自棕进行回收的资源,主要是指托管堆上分配的内存...

c#中的非托管资源释放 (Finalize和Dispose)

在了解Finalize和Dispose之前,我们需要了解两个概念,一个是托管资源,一个非委托资源。 a.其中托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,例如程序中分配的...
  • fxqcn
  • fxqcn
  • 2011年10月20日 08:24
  • 505

.Net关于对象的销毁(IDisposable和using) - 非托管资源

CLR 有一个 垃圾收集GC  机制,可以管理内存分配和回收等工作,在绝大多数情况下,程序员只需要new 一个对象,而将销毁这一对象的工作完全交给CLR代劳。         但是,我们所编写的类中...

.Net的内存管理,非托管资源的处理原则

在.Net框架中,内存的回收是由垃圾回收器去管理的,所以我们可以尽情的去申请内存资源,而不必考虑释放。但有些情况比较特别,对于非托管资源,我们最好自己考虑去释放。 非托管资源(Unmanaged R...

可以使用 using 或者 try-catch-finally 调用 Dispose() 来释放非托管资源

转自http://www.cnblogs.com/yuliantao/archive/2011/01/11/1933384.html   1.我们常使用IDisposable接口的Dispose(...

清理非托管资源

实现 Dispose 方法;Finalize 方法和析构函数;重写 Finalize 方法;C# 与 C++ 中的析构函数语法;使用封装资源的对象。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:托管资源和非托管资源
举报原因:
原因补充:

(最多只允许输入30个字)