.Net的垃圾回收机制

什么是垃圾回收机制

在.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从根引用表中查找所有引用对象,并继续查找引用对象树。这时,它才将没有引用变量的对象处理掉。

  1. 标记存活的对象并建立一个列表。
  2. 更新存活的对象的引用。
  3. 收回没有引用变量的的对象的空间。
  4. 整理堆空间,移动存活对象到区末尾。

GC运行的时间一般不需要用户控制,但是.Net提供接口System.Collect.GC()方法,让用户在需要的时候调用GC。

GC的性能提升

为了提高程序性能,GC采用了一些算法以加快回收速度,比如基于年龄的回收算法Age-based Garbage Collection,先回收最新的对象以及与其相关的对象。

何时调用GC

当以下情形之一出现时,系统调用GC回收内存

  • 系统可用内存容量偏低。
  • 已存在对象占用内存空间超过一定阙值。
  • 用户调用GC.Collect()。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值