概述
.Net 的垃圾回收机制
- 什么是垃圾回收机制
- Garbage Collector运行机制
- 处理值类型对象
- 处理引用类型对象
- 引用类型对象的存放机制
- 小对象堆的处理机制
- GC 的回收过程
- GC的性能提升
- 何时调用GC
什么是垃圾回收机制
在.Net 平台,用户可以手动也可以通过.Net提供的垃圾收集器Garbage Collector(后称GC)释放被占用的资源。总所周知,.Net的内存分为可管理内存和不可管理内存,可管理内存包括栈stack和可管理堆managed heap,不可管理内存就是不可管理堆,包括文件的Handler、数据库的Connection等等。可管理内存可以让GC自动处理,而不可管理内存只能用户手动清理。这就是.Net 的垃圾回收机制。
Garbage Collector运行机制
处理值类型对象
由于值类型对象被存放在栈中,GC可以直接清理。所以这里重点说一下引用类型对象。
处理引用类型对象
引用类型对象的存放机制
引用类型对象被分为大对象(超过85K)和小对象(小于85K),大对象被专门放在一个特殊堆中,因为每次GC清理完一些对象后,堆中会出现一些不连续的空闲的内存空间,导致堆空间碎片化,因此GC把仍存在的对象移动在一片连续的内存空间里,这样避免内存空间浪费,这一过程被称为压缩堆。而大对象移动的起来比较费劲,所以将大对象和小对象放在独立的两个堆里。大对象堆是从来不压缩的。
小对象堆的处理机制
.Net将小对象堆分为三代区块(generation 0, 1, 2 section),从0代区到2代区,最新建立的对象存放在0代区;GC运行第一次后,存活下的对象被放到1代区,新对象放到0代区;GC第二次运行后,重复刚才的过程,1代区存活的对象放到2代区,0代区对象放到1代区。二代区和大对象区的收集处理工作由一个专门的后台线程完成,所以主程序线程只被0代区和1代区的处理线程阻塞,和其他区没有关系。大对象堆在物理上是独立的空间,但是根据微软的文档,它在逻辑上被认为是2代区的一部分,所以也可以认为大对象直接被存放在2代区。
GC 的回收过程
GC处理引用类型对象时,首先要清理其栈中的引用变量,但是并不立即处理对应的存放在堆中的对象。GC从根引用表中查找所有引用对象,并继续查找引用对象树。这时,它才将没有引用变量的对象处理掉。
- 标记存活的对象并建立一个列表。
- 更新存活的对象的引用。
- 收回没有引用变量的的对象的空间。
- 整理堆空间,移动存活对象到区末尾。
GC运行的时间一般不需要用户控制,但是.Net提供接口System.Collect.GC()方法,让用户在需要的时候调用GC。
GC的性能提升
为了提高程序性能,GC采用了一些算法以加快回收速度,比如基于年龄的回收算法Age-based Garbage Collection,先回收最新的对象以及与其相关的对象。
何时调用GC
当以下情形之一出现时,系统调用GC回收内存
- 系统可用内存容量偏低。
- 已存在对象占用内存空间超过一定阙值。
- 用户调用GC.Collect()。
最后
以上就是醉熏砖头为你收集整理的.Net的垃圾回收机制什么是垃圾回收机制Garbage Collector运行机制的全部内容,希望文章能够帮你解决.Net的垃圾回收机制什么是垃圾回收机制Garbage Collector运行机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复