C#的垃圾回收

本文介绍了C#中的垃圾回收,包括托管堆的概念和作用,垃圾回收算法如引用计数和引用跟踪,以及代的概念和提升性能的方式。讨论了垃圾回收的触发条件,如内存不足、Collect方法调用等,并特别提到了大对象的处理及其对性能的影响。
摘要由CSDN通过智能技术生成

托管堆和垃圾回收
堆栈 stack 类似于Java的 方法区和虚拟机栈 程序运行过程中的空间分配,临时参数,引用等
托管堆 类似与 JVM中的堆 存储对象实例 ,在堆上的内存存储对象实例。
托管堆中维护一个NextObjptr指针,指向下一个对象在堆中的分配位置。

分配、初始化资源并直接使用。大多数类型无需资源清理,垃圾回收器会自动释放资源。

因为内存受限,且CLR总是要分配对象,所以需要用垃圾回收技术删除堆中不需要的对象。

垃圾回收算法

在new一个对象的时,内存空间不足,CLR就执行垃圾回收。
通常在0代满的时候就进行回收,

-引用计数

每个对象都维护一个内存字段统计程序中的使用对象。

代码中某个不再需要对象的地方,就递减对象的计数字段,变为0时对象删除。
处理不好循环引用,改用引用跟踪算法(Java 可达性分析)

-引用跟踪
只关心引用类型的变量,因为只有这种变量才引用堆上的对象。
引用类型变量可在许多场合使用,包括类的静态和实例字段,或者方法的参数和局部变量。
以引用类型变量为根

开始GC时,暂停进程中的所有线程。防止线程在检查期间改变对象状态。
标记阶段 遍历堆中对象,并检查活动根查看它们引用了哪些对象,标记堆上的对象。
对象标记后,会检查那个对象中的根,标记他们引用的对象。
压缩阶段 压缩幸存的对象,使他们占用连续的内存空间

代:提升性能
对象在堆中分为第0代 第1代 第2代。CLR会为每一代分配预算空间,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值