C#内存管理和垃圾回收机制

2021-02-17 05:17

阅读:532

  • 数据类型
  • 垃圾回收机制

一、数据类型

C#中的数据类型分为值类型 (Value type) 引用类型(reference type)

值  类 型: 所有的值类型都集成自 System.ValueType 上,除非加声明?否则不可为null,保存在 堆栈(Stack,先进后出上,常见的值类型有:整形、浮点型、bool、枚举等。

 

引用类型:所有的引用类型都继承自System.Object 上,引用类型保存在 托管堆(Head,先进先出)上,常见的类型有:数组、字符串、接口、委托、object等。

拆箱和装箱:引用类型和值类型的相互转换叫做拆装箱操作。

拆箱:拆箱就是将一个引用型对象转换成任意值型!比如:

int i=0;
System.Object obj=i;
int j=(int)obj;

 

装箱:装箱就是隐式的将一个值型转换为引用型对象。比如:

 

int i=0;
Syste.Object obj=i;

 

二、垃圾回收机制 GC

  1、简介

      C#中和Java一样是一种系统自动回收释放资源的语言,在C#环境中通过 GC(Garbage Collect)进行系统资源回收,在数据基本类型中介绍到,C#数据类型分为引用类型和值类型,

值类型保存在Stack上,随着函数的执行作用域执行完毕而自动出栈,所以这一类型的资源不是GC所关心 对象。GC垃圾回收主要是是指保存在Heap上的资源。

       .NET的GC机制有这样两个问题:
  首先,GC并不是能释放所有的资源。它不能自动释放非托管资源。
  第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性。
  GC并不是实时性的,这会造成系统性能上的瓶颈和不确定性。所以有了IDisposable接口,IDisposable接口定义了Dispose方法,这个方法用来供程序员显式调用以释放非托管资源。使用using语句可以简化资源管理。
  

  2、托管资源和非托管资源

上面介绍到,GC只释放托管资源,那么什么是托管资源和费托管资源。

  托管资源  托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源。托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收。

  非托管资源非托管资源指的是.NET不知道如何回收的资源,最常见的一类非托管资源是包装操作系统资源的对象,例如文件,窗口,网络连接,数据库连接,画刷,图标 等。这类资源,

垃圾回收器在清理的时候会调用Object.Finalize()方法。默认情况下,方法是空的,对于非托管对象,需要在此方法中编写回收非托管资源的代码,以便垃圾回收器正确回收资源。

总结:托管资源是释放由GC来完成,释放的时间吧不一定,一般是系统感觉内存吃紧,会进行紧急回收资源。一个对象想成为被回收,首先需要成为垃圾,GC是通过判断对象及其子对象有没有指向有效的引用,

如果没有GC就认为它是垃圾。垃圾回收机制通过一定的算法得到哪些没有被被引用、或者不再调用的资源,当这些垃圾达到一定的数量时,回启动垃圾回收机制,GC回收实际上是调用了析构函数。

垃圾回收机制意味着你不需要担心处理不再需要的对象了。咱们关心的主要是非托管资源的释放。

  3、非托管资源的释放

在定义一个类时,可以使用两种不同的机制类释放非托管资源,这两周机制有时候通常放在一起使用

1、声明析构函数(终结器)吗,作为类的成员

2、在类中实现 System.IDisposable 接口

 

 

    public class AA
        {
            ~AA()
            {
                MessageBox.Show("析构函数被执行了");
            }
        }

 


评论


亲,登录后才可以留言!