C#的GC机制

个人声明:所有的文章都是因为个人面试所写

GC机制即为Garbage Collection,垃圾回收,有别于C++每次申请内存都要自己析构/释放掉内存,C#的GC机制不需要我们自己手动释放所申请的内存,会交给系统进行释放,更好的专注开发。

本篇主要介绍

内存管理池

激活

触发机制

GC操作

为了节省时间我贴下思维导图

C#的GC机制_第1张图片

 

内存管理机制

要说回收之前先讲内存分区,c#的分区如下

1) 栈区:由编译器自动分配释放 ,存放值类型的对象本身,引用类型的引用地址(指针),静态区对象的引用地址(指针),常量区对象的引用地址(指针)等。其操作方式类似于数据结构中的栈。

2) 堆区(托管堆):用于存放引用类型对象本身。在c#中由.net平台的垃圾回收机制(GC)管理。栈,堆都属于动态存储区,可以实现动态分配。

3) 静态区及常量区:用于存放静态类,静态成员(静态变量,静态方法),常量的对象本身。由于存在栈内的引用地址都在程序运行开始最先入栈,因此静态区和常量区内的对象的生命周期会持续到程序运行结束时,届时静态区内和常量区内对象才会被释放和回收(编译器自动释放)。所以应限制使用静态类,静态成员(静态变量,静态方法),常量,否则程序负荷高。

4) 代码区:存放函数体内的二进制代码。

程序声明的变量只会在栈或者堆内存中,取决于类型作用域

堆内存一般用于自己申请的大空间(例如new出来),需要存储大量数据以及保持长久,就会在堆内存中,申请时间较长,会先使用空闲空间,不够再会去回收被标记的空间使用,再不够才会申请拓展空间。

栈内存主要用于临时变量,这类数据不会占据很大空间如常量、引用等。

激活

所谓的激活就是系统调用该部分的内存,A内存刚用于计算即被激活状态那么这块内存就会被分配,相反B内存如果长久不使用的话就会被GC机制标记为非激活,被标记并不代表会被立刻回收,会等后面GC机制触发之后才会回收,这里要先讲一下我们的变量只有使用的时候才会被分配内存,只是声明变量的话只会分配“空间”,所以说变量占据的是空间,GC标记的是那些不使用的空间随后回收。

触发机制

GC机制触发会有三种情况,分别为

1、空间不够时

2、自动触发

3、强制回收

第一种空间不够时回收是因为分配的空间不足在需要的时候会回收标记的空间,用于分配新的对象变量,而堆内存比较常见,因为堆内存经常申请加大空间,顺序分别为 1、闲置空间 2、回收标记内存 3、申请扩容

第二种自动触发是自带的,为了维持程序的流畅度,GC机制会自己巡逻在“随机”进行GC回收掉标记的空间。

第三种我们可以自主调用GC机制进行回收

GC操作

GC机制的操作主要集中在确认该内存是否在引用,流程如下

1、检查内存存储的变量

2、确认是否被调用

3、非引用则标记为可回收

4、将被标记的变量移除,所占的空间回收到内存中

总结:

GC机制有点像C++里面的析构函数,要自己申请自己释放,但在C#中我们不需要自己释放会有GC来帮我们释放,并且要记住GC机制只会回收堆内存中的数据,值类型的数据在栈中使用过就会释放,可能会说指针方面,但C#中指针操作时不安全的,一般避免使用,但是不代表不能使用,可以开启unsafe code。

你可能感兴趣的:(unity,c#)