托管资源和非托管资源

转载 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方法)的不可以访问的内存。它改为将这些对象的项从终止队列中移除并将他们放置在标记

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

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

相关文章推荐

Install MySQL 5.7/8.0 on Fedora 26/25, CentOS/RHEL 7.3/6.9

Install MySQL 5.7/8.0 on Fedora 26/25, CentOS/RHEL 7.3/6.9

使用using清理非托管资源

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

非托管资源内存泄露调测

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

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

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

清理非托管资源

实现 Dispose 方法;Finalize 方法和析构函数;重写 Finalize 方法;C# 与 C++ 中的析构函数语法;使用封装资源的对象。

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

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

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

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

C#-如何释放非托管资源

//将需要调用非托管资源的代码放在一个类文件里面,同时,加上下面的这些方法。 .NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内...

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

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

.NET 清理非托管资源

Dispose      类型的 Dispose 方法应释放它拥有的所有资源。它还应该通过调用其父类型的 Dispose 方法释放其基类型拥有的所有资源。该父类型的 Dispose 方法应该释放...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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