C#回收机制之资源回收托管

一、常见非托管资源

  • Windows窗口句柄、数据库链接、GDI对象、独占文件锁等等对象
  • ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor
  • FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen
  • Regex,Socket,StreamWriter,Timer,Tooltip

二、实现原理

定义类继承IDisposable接口

public class DisposeTest : IDisposable
{
    //实现IDisposable接口方法
    public void Dispose()
    {

    }
}

在类中定义资源和方法

    public class DisposeTest : IDisposable
    {

        #region Dispose经典实现方式

        //实现IDisposable接口方法
        public void Dispose()
        {
            Dispose(true);//调用处理方法
            GC.SuppressFinalize(this);//让GC忽略
        }

        //资源
        private readonly IntPtr unmanagedResource;//非托管内存
        private readonly SafeHandle managedResource;//托管资源 

        //构造方法初始化资源
        public DisposeTest()
        {
            unmanagedResource = Marshal.AllocHGlobal(sizeof(int));//分配非托管内存
            managedResource = new SafeFileHandle(new IntPtr(), true);//创建托管资源
        }
		//根据不同资源进行处理
        protected virtual void Dispose(bool isManualDisposing)
        {
            ReleaseUnmanagedResourse(unmanagedResource);//处理非托管资源
            if (isManualDisposing)
            {
                ReleaseManagedResources(managedResource);//处理托管资源
            }
        }

        private void ReleaseUnmanagedResourse(IntPtr intPtr)
        {
            Marshal.FreeHGlobal(intPtr); //释放非托管内存
        }

        private void ReleaseManagedResources(SafeHandle safeHandle)
        {
            if (safeHandle != null)
            {
                safeHandle.Dispose(); //释放托管资源
            }
        }

        //析构函数处理托管资源
        ~DisposeTest()
        {
            Dispose(false);
        }
        #endregion
    }

三、Close()和Dispose()区别

  • lose()方法关闭对象,没有完全释放。Dispose()方法完全释放了
  • 一般情况,Close() 实现了接口对Dispose()的封装,调用时不需要直接调用Dispose()

四、常见封装的语法写法

Close()方法

SqlConnection conn3 = new SqlConnection();
try
{
    conn3.Open();
}
catch (Exception)
{
    throw;
}
finally
{
    conn3.Close();//关闭对象
}

using()

using (SqlConnection cnn = new SqlConnection())
{
    //此处使用,使用完后系统会自动释放
}

Dispose()

SqlConnection cnn2 = new SqlConnection();
try
{
    //这里写要执行的代码
}
finally
{
    cnn2.Dispose();
}

到此这篇关于C#回收机制之资源回收托管的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • asp.net中C#实现手动回收内存的方法

    C#有自动回收内存的机制,但是有时自动回收有一定滞后,需要在变量使用后迅速回收,节约内存,这里介绍一个最简单的方法. 1.先对对象赋值 null; 2.使用System.GC.Collect() 复制代码 代码如下: class Program {          static void Main(string[] args)          {              long lenth = 1024 * 1024 * 128;                GetCost("程序启动

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

    理解C#垃圾回收机制我们首先说一下CLR(公共语言运行时,Common Language Runtime)它和Java虚拟机一样是一个运行时环境,核心功能包括:内存管理.程序集加载.安全性.异步处理和线程同步. CTS(Common Type System)通用类型系统,它把.Net中的类型分为2大类,引用类型与值类型..Net中所有类型都间接或直接派生至System.Object类型.所有的值类型都是System.ValueType的子类,而System.ValueType本身却是引用类型.

  • c# 垃圾回收(GC)优化

    GC,Garbage Collect,中文意思就是垃圾回收,指的是系统中的内存的分配和回收管理.其对系统性能的影响是不可小觑的.今天就来说一下关于GC优化的东西,这里并不着重说概念和理论,主要说一些实用的东西.关于概念和理论这里只做简单说明,具体的大家可以看微软官方文档. 一.什么是GC GC如其名,就是垃圾收集,当然这里仅就内存而言.Garbage Collector(垃圾收集器,在不至于混淆的情况下也成为GC)以应用程序的root为基础,遍历应用程序在Heap上动态分配的所有对象[2],通过

  • C#的内存回收代码

    本文实例讲述了C#的内存回收方法.分享给大家供大家参考.具体实现方法如下: 如下示例代码是调用win32底层操作,可实现内存的回收. 复制代码 代码如下: [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")] public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSi

  • C#开发中的垃圾回收机制简析

    GC的前世与今生 虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是GC的第一次出现.Lisp的程序员认为内存管理太重要了,所以不能由程序员自己来管理.但后来的日子里Lisp却没有成气候,采用内存手动管理的语言占据了上风,以C为代表.出于同样的理由,不同的人却又不同的看法,C程序员认为内存管理太重要了,所以不能由系统来管理,并且讥笑Lisp程序慢如乌龟的运行速度.的

  • C#垃圾回收机制的详细介绍

    一.托管代码/非托管代码C#代码通过C#编译器编译成程序集,程序集由微软中间语言组成,CLR会为程序集开辟一个应用程序域,程序集就是运行在这个应用程序域里面的,应用程序域是相互独立的,互不影响.托管代码:被CLR管理的代码.非托管代码:不被CLR管理的代码.分配在栈空间的变量,一旦执行完成其所在的作用域(即大括号范围)就会被CLR回收.分配在堆里面的对象,当没有任何变量引用它的时候,这个对象就被标记为"垃圾对象"(没有变量引用它),等待垃圾回收器回收.Eg: 复制代码 代码如下: Pe

  • C# 的析构以及垃圾回收实例分析

    C# 的析构以及垃圾回收实例分析 看书时,自己写的例子代码,了解到几个知识点,记载下来.同时发现自己手写代码的能力比较弱,还是得多写一下. using System; namespace ConsoleApplication { public class Program { public static void Main(string[] args) { Console.WriteLine("Hello World!"); fun(); GC.Collect(); //4.若不显式回收

  • c#如何用好垃圾回收机制GC

    一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对资源(内存使用)管理的方式,常见的一般有如下几种: 1.手动管理:C,C++ 2.计数管理:COM 3.自动管理:.NET,Java,PHP,GO- 但是,手动管理和计数管理的复杂性很容易产生以下典型问题: 1.程序员忘记去释放内存 2.应用程序访问已经释放的内存 产生的后果很严重,常见的如内存泄露.数据内容乱码,而且大部分时候,程序的

  • C#回收机制之资源回收托管

    一.常见非托管资源 Windows窗口句柄.数据库链接.GDI对象.独占文件锁等等对象 ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen Regex,Socket,StreamWriter,Timer,Tooltip 二.实现原理 定义类继承

  • Java的垃圾回收机制实例分析

    本文实例讲述了Java的垃圾回收机制.分享给大家供大家参考,具体如下: 一 点睛 当程序创建对象.数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区中,当这块内存不再被任何引用变量引用时,这块内存就变成了垃圾,等待垃圾回收机制进行回收. 垃圾回收机制的特点: 垃圾回收机制只负责回收堆内存中对象,不会回收任何任何物理资源(例如数据库连接,网络IO等资源). 程序无法精确控制垃圾回收的运行,垃圾回收会在合适时候进行垃圾回收.当对象永久性地失去引用后,系统就会在合适时候

  • 一文带你了解JavaScript垃圾回收机制

    目录 1. 概述 2. 内存管理 3. 垃圾回收 4. GC算法介绍 5. 引用计数算法 1. 引用计数优缺点 6. 标记清除算法 1. 标记清除算法优缺点 7. 标记整理算法 8. 执行时机 9. V8引擎 1. 垃圾回收策略 2. 回收新生代对象 3. 回收老生代对象 4. V8垃圾回收总结 10. Performance工具介绍 1. 内存问题的体现 2. 监控内存的几种方式 3. 任务管理器监控内存 4. TimeLine记录内容 5. 堆快照查找分离DOM 6. 判断是否存在频繁GC

  • Java垃圾回收机制简述

    说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理. 顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为"垃圾"?那么当一些对象被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的垃圾收集器?下面我们就来逐一探讨这些问题.以下是本文的目录大纲: 如何确定某个对象是"

  • Python语法垃圾回收机制原理解析

    一 引入 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,那什么样的变量值是没有用的呢? 由于变量名是访问到变量值的唯一方式,所以当一个变量值不再关联任何变量名时,我们就无法再访问到该变量值了,该变量值就是没有用的,就应该被当成一个垃圾回收. 毫无疑问,内存空间的申请与回收是非常耗费精力的事情,而且存在很大的危险性,稍有不慎就有可能引发内存溢出问题,好在Cp

  • 如何快速理解python的垃圾回收机制

    一.先来说说为什么要有垃圾回收 解释器在执行到定义变量得语法时,会申请内存空间来存放变量得值,但是由于内存空间是有限得,所以这就涉及到了内存回收问题了,当一个变量值没有用了(简称垃圾),这种时候就应该回收掉这个变量值得内存空间. 二.那么什么是垃圾回收机制 垃圾回收机制(简称GC)是Python解释器自带一种机,专门用来回收不可用的变量值所占用的内存空间 三.为什么要用垃圾回收机制呢? 程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间如果不及时清理的话会导致内存使用殆尽(内存溢出),

  • python语言开发垃圾回收机制原理教程

    目录 一.什么是垃圾回收机制 二.为什么要有垃圾回收机制 三.垃圾回收机制的原理 1.引用计数 直接引用 间接引用 2.栈区 / 堆区 3.总结 四.标记清除 1.循环引用问题(也叫交叉引用) 2.循环引用导致的结果 3.解决方法 : 清除-标记 五.分代回收 1.效率问题 2.解决方法 : 分代回收 分代 回收 总结 一.什么是垃圾回收机制 垃圾回收机制(简称GC), 解释器自带的一种机制 它是一种动态存储管理技术,自动释放不再被程序引用的对象所占用的内存空间 二.为什么要有垃圾回收机制 程序

  • python语法 之垃圾回收机制

    目录 一 引入 二.什么是垃圾回收机制? 三.为什么要用垃圾回收机制? 四.垃圾回收机制原理分析 4.1.什么是引用计数? 4.2.引用计数扩展阅读 4.2.1 标记-清除 4.2.2 分代回收 一 引入 ​ 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,那什么样的变量值是没有用的呢? ​ 由于变量名是访问到变量值的唯一方式,所以当一个变量值不再关联任何变

  • jQuery+ajax的资源回收处理机制分析

    本文实例分析了jQuery+ajax的资源回收处理机制.分享给大家供大家参考,具体如下: jquery还有一个 complete对象,是请求完成后回调函数 (请求成功或失败之后均调用). 同时有两个参数XMLHttpRequest, textStatus.所以,我们只需要在请求完成后,将传回的XMLHttprequest对象手工回收即可,代码如下: $.ajax({ url: "http://localhost/do_ajax.php", data: { name: "xxx

随机推荐