托管和非托管资源

news/2024/7/20 13:32:28 标签: 内存管理, 操作系统, c#

对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的只是了解.net CLR如何做这些操作。也就是说对于您的应用程序创建的大多数对象,可以依靠  .NET Framework 的垃圾回收器隐式地执行所有必要的内存管理任务。

 

对于非托管资源,您在应用程序中使用完这些非托管资源之后,必须显示的释放他们,例如System.IO.StreamReader的一个文件对象,必须显示的调用对象的Close()方法关闭它,否则会占用系统的内存和资源,而且可能会出现意想不到的错误。

 

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

 

最常见的一类非托管资源就是包装操作系统资源的对象,例如文件,窗口或网络连接,对于这类资源虽然垃圾回收器可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。还好.net  Framework提供了Finalize()方法,它允许在垃圾回收器回收该类资源时,适当的清理非托管资源。如果在MSDN Library 中搜索Finalize将会发现很多类似的主题,这里列举几种常见的非托管资源:ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader
,Pen,Regex,Socket,StreamWriter,Timer,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方法)的不可以访问的内存。它改为将这些对象的项从终止队列中移除并将他们放置在标记为“准备终止”的对象列表中,该列表中的项指向托管堆中准备被调用其终止代码的对象,下次垃圾回收器进行回收时,就回收并释放了这些内存。


当然还有其它的影响不使用Finalize()的理由,参考后续的文章!


http://www.niftyadmin.cn/n/1679937.html

相关文章

微软职位内部推荐-Software Engineer II-Senior Software Engineer for Satori

微软近期Open的职位: Title: Software Engineer II-Senior Software Engineer for Satori, STC Location: Beijing or Suzhou Search Engine has been evolving from key word search into intention fulfillment and task completion, in which entity and knowledge technolo…

Java设计模式(9)适配器模式(Adapter模式)

适配器模式定义:将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份。 为何使用适配器模式 我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自…

使用metawebblog api 实现自己的博客接口

metawebblog api 是一个博客标准,这样我们就可以通过实现这个标准来实现 我们自己的博客支持word2007,windows liver writer来写博客. metablog的.net接口如下. using System;using System.Collections.Generic;using System.Text;using CookComputing.XmlRpc; namespace blog…

增加 IDEA 控制台输出行数

有时候控制台输出的内容太多,导致一部分内容被自动清掉了 这个时候就需要增加一下 idea 的控制输出内容大小了,将其调大一点,就会输出更多的内容了。

python 配对t检验_配对样本t检验

基本原理:见“统计学基础-t检验基本原理”适用情况:同一受试对象处理前后的比较或将受试对象按照某一条件进行配对,分别给予不同处理,观察两种处理效果是否有差异。SPSS操作举个栗子:为了研究结直肠癌患者手术前后血清…

Android计时器TimerTask,Timer,Handler

Android计时器TimerTask,Timer,若要在TimerTask中更新主线程UI,鉴于Android编程模型不允许在非主线程中更新主线程UI,因此需要结合Android的Handler实现在Java的TimerTask中更新主线程UI。 现给出一个简单示例。代码使用标准Java的…

舞龙机器人_芜湖机器人产业园:到2025年力争实现年产值500亿元

来源:安徽财经网说到机器人产业,芜湖可谓名声在外。10月21日下午,中宣部“推动高质量发展调研行”采访团来到芜湖机器人产业园。芜湖机器人产业园规划用地5300亩,总体布局6大功能区:工业机器人本体及核心零部件研发制造…

使用IDEA-Maven工具编译Scala工程时报错:scalac: Error: Error compiling the sbt component ‘compiler-interface-2.11

出现的问题 IDEA 运行 scala 项目的时候报错 scalac: Error: Error compiling the sbt component compiler-interface-2.11.8-62.0 sbt.internal.inc.CompileFailed: Error compiling the sbt component compiler-interface-2.11.8-62.0 ...环境 IDEA:2022 JDK&a…