.NET垃圾回收器原理

垃圾回收机制可以说是运行时的核心。垃圾回收是指回收所有不再被引用对象所占用的内存。即处理的是引用对象、只负责回收其堆上的内存。而也就是说一直被引用的对象可以阻止垃圾回收器对自己的操作

垃圾回收采用的是mark and compact算法。要识别的是对象的根引用,根引用来自静态变量、局部变量、参数实例、CPU寄存器以及(f-reachable对象)的引用。基于这个列表,垃圾回收可以遍历所有根引用所标识的树形结构、并递归所有根引用所指向的对象。由此可以访问所有可达对象。

回收不是枚举所有可达对象,而是通过压缩相邻可达对象,这样会覆盖不可达对象的内存。

在进行垃圾回收的期间需要保持状态一致,即所有托管线程的暂停。为避免执行关键代码期间进行垃圾回收,可在关键代码前使用System.GC对象的Collect方法,但是本方法只能尽量保证执行关键代码时不进行垃圾回收,除非关键代码会消耗大量内存,一般不会出问题。

垃圾回收机制定义“代”的概念。(丐帮六袋长老)不过这个代最多两代。也就是说垃圾回收并不是所有对象内存都在同一周期内完成回收。相对于长期存在对象,新建对象需要回收的概率会更大。这个长期存在的可能就是二代,而新创建的为零代。两者之间零代优先回收!!!


平时我们使用的变量大多为强引用,即能阻止垃圾回收器的行为。而弱引用不能阻止一个对象执行垃圾回收,却能维持一个引用,也就代表只要垃圾回收不清除对象,,既可以重用。

弱引用为了维护一些创建成本较大、维护起来开销较大的对象。相当于内存缓存。

下面举个弱引用的小例子:

<span style="font-size:18px;">        private WeakReference Data;
        public FileStream GetData()
        {
            //Target获取当前对象的引用。将弱引用类型赋给强引用类型防止垃圾回收运行清除弱引用。
            //强引用会阻止垃圾回收清除对象,所以必须先赋值而不是先检查Target是不是为null
            FileStream data = (FileStream)Data.Target;
            //为避免在执行检查null和访问数据期间进行垃圾回收
            //指派了弱引用变量Data,为了检查是否垃圾回收,先判断是否为null
            if (data != null)
                return data;
            else
                Data.Target = data;
            return data;
        }
</span>





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值