• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 浅谈关于C#的垃圾回收机制

浅谈关于C#的垃圾回收机制

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了浅谈企业技术创新机制,浅谈企业激励机制,浅谈容错纠错机制,浅谈三项机制,浅谈激励机制等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

  理解C#垃圾回收机制我们首先说一下CLR(公共语言运行时,Common Language Runtime)它和Java虚拟机一样是一个运行时环境,核心功能包括:内存管理、程序集加载、安全性、异步处理和线程同步。

CTS(Common Type System)通用类型系统,它把.Net中的类型分为2大类,引用类型与值类型。.Net中所有类型都间接或直接派生至System.Object类型。所有的值类型都是System.ValueType的子类,而System.ValueType本身却是引用类型。


托管资源:
  由CLR管理的存在于托管堆上的称为托管资源,注意这里有2个关键点,第一是由CLR管理,第二存在于托管堆上。托管资源的回收工作是不需要人工干预的,CLR会在合适的时候调用GC(垃圾回收器)进行回收。

非托管资源:
  非托管资源是不由CLR管理,例如:Image Socket, StreamWriter, Timer, Tooltip, 文件句柄, GDI资源, 数据库连接等等资源(这里仅仅列举出几个常用的)。这些资源GC是不会自动回收的,需要手动释放。


通过上面的讲述总结一下,第一,GC(垃圾回收器)只回收托管资源,不回收非托管资源。第二,GC回收是要在合适的时候(CLR觉得应该进行回收的时候)才进行回收。那么非托管如何进行回收呢?下面就让我一一道来。

在.Net中释放非托管资源主要有2种方式,Dispose,Finalize

Dispose方法,对象要继承IDisposable接口,也就会自动调用Dispose方法。

Suifeng suiFeng= new Suifeng ();

suiFeng.Dispose();

//也可以使用Using语句
(using Suifeng suiFeng= new Suifeng())
{
     //
}
</div>

Finalize()方法

MSDN上的定义是允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。
它的本质就是析构函数

该析构函数隐式地对对象的基类调用 Finalize。 这样,前面的析构函数代码被隐式地转换为以下代码:

在.NET中应该尽可能的少用析构函数释放资源,MSDN2上有这样一段话:
  实现 Finalize 方法或析构函数对性能可能会有负面影响,因此应避免不必要地使用它们。用 Finalize 方法回收对象使用的内存需要至少两次垃圾回收。当垃圾回收器执行回收时,它只回收没有终结器的不可访问对象的内存。这时,它不能回收具有终结器的不可访问对象。它改为将这些对象的项从终止队列中移除并将它们放置在标为准备终止的对象列表中。该列表中的项指向托管堆中准备被调用其终止代码的对象。垃圾回收器为此列表中的对象调用 Finalize 方法,然后,将这些项从列表中移除。后来的垃圾回收将确定终止的对象确实是垃圾,因为标为准备终止对象的列表中的项不再指向它们。在后来的垃圾回收中,实际上回收了对象的内存。


  所以有析构函数的对象,需要两次,第一次调用析构函数,第二次删除对象。而且在析构函数中包含大量的释放资源代码,会降低垃圾回收器的工作效率,影响性能。所以对于包含非托管资源的对象,最好及时的调用Dispose()方法来回收资源,而不是依赖垃圾回收器。
   在一个包含非托管资源的类中,关于资源释放的标准做法是:
   继承IDisposable接口;
   实现Dispose()方法,在其中释放托管资源和非托管资源,并将对象本身从垃圾回收器中移除(垃圾回收器不在回收此资源);
   实现类析构函数,在其中释放非托管资源。
   请看MSDN上的源码  

            GC.SuppressFinalize(this);
         }

         //由垃圾回收器调用,释放非托管资源

       ~BaseResource()
        {
           Dispose(false);// 释放非托管资源
        }

     //参数为true表示释放所有资源,只能由使用者调用
    //参数为false表示释放非托管资源,只能由垃圾回收器自动调用
   //如果子类有自己的非托管资源,可以重载这个函数,添加自己的非托管资源的释放
  //但是要记住,重载此函数必须保证调用基类的版本,以保证基类的资源正常释放
    Protectedvirtual void Dispose(bool disposing)
    {
       If(!this.disposed)// 如果资源未释放 这个判断主要用了防止对象被多次释放
         {
            If(disposing)
            {
               Comp.Dispose();// 释放托管资源
             }

           closeHandle(handle);// 释放非托管资源
           handle= IntPtr.Zero;
           }
          this.disposed= true; // 标识此对象已释放
      }
  }
</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 浅谈关于C#的垃圾回收机制

相关文章

  • 2017-05-28在C#中新手易犯的典型缺陷
  • 2017-05-28C#获取存储过程返回值和输出参数值的方法
  • 2017-05-28C#的path.GetFullPath 获取上级目录实现方法
  • 2017-05-28C#通过Semaphore类控制线程队列的方法
  • 2017-05-28C#之Socket操作类实例解析
  • 2017-05-28C#遍历系统进程的方法
  • 2017-05-28C#操作 JSON方法汇总
  • 2017-05-28C#窗口实现单例模式的方法
  • 2017-05-28spreadsheetgear插件屏蔽鼠标右键的方法
  • 2017-05-28C# 遍历文件夹子目录下所有图片及遍历文件夹下的文件

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • c#生成缩略图的实现方法
    • 轻松学习C#的抽象类
    • C#创建自签名认证文件的方法
    • C#操作DataTable方法实现过滤、取前N条数据及获取指定列数据列表的方法
    • 使用C#实现阿拉伯数字到大写中文的转换
    • C#读取XML的三种实现方式
    • 关于C#中ajax跨域访问问题
    • C#实现判断字符串中是否包含中文的方法
    • C#实现单件模式的三种常用方法
    • c#中datagridview处理非绑定列的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有