C#-垃圾回收机制

GC(Garbbage Colloctor)垃圾回收器

CLR的GC即内存管理机制。写程序不需关心内存的使用,CLR会做

垃圾回收器的原理

对某一块地址进行编写(计数器)、当使用的数量为0时(一段时间一检测),系统就会释放该地址,c1=null

垃圾回收的过程是在遍历堆(Heap)上动态分配的所有对象,通过识别它们是否被引用来确定哪些对象是垃圾,哪些对象仍要被使用。所谓的垃圾就是没有被任何变量,对象引用的内容。 此时垃圾就需要被回收释放

GC只负责堆(Heap)内存的垃圾回收,

引用类型都是存在堆(Heap)中的,所以它的分配和释放都通过垃圾回收机制来管理

--------------------------------------------------------

栈(Stack)上的内存是由系统自动管理。

值类型在栈(Stack)中分配内存的,他们有自己的生命周期,不用对他们进行管理,会自动分配和释放

垃圾回收算法
  1. 引用计数(Reference Counting)

  2. 标记清除(Mark Sweep)

  3. 标记整理(Mark Compact)

  4. 复制集合(Copy Collection)

手动触发垃圾回收的方法

一般情况下 我们不会频繁调用,都是在 Loading过场景时 才调用

GC.Collect();

C#中内存回收机制的大概原理

0代内存     1代内存     2代内存

代的概念:

        代是垃圾回收机制使用的一种算法(分代算法)

        新分配的对象都会被配置在第0代内存中

        每次分配都可能会进行垃圾回收以释放内存(0代内存满时) 

在一次内存回收过程开始时,垃圾回收器会认为堆中全是垃圾,会进行以下两步

  1. 标记对象 从根(静态字段、方法参数)开始检查引用对象,标记后为可达对象,未标记为不可达对象。不可达对象就认为是垃圾
  2. 搬迁对象压缩堆  (挂起执行托管代码线程) 释放未标记的对象 搬迁可达对象 修改引用地址

大对象总被认为是第二代内存  目的是减少性能损耗,提高性能。释放内存也会消耗性能

不会对大对象进行搬迁压缩  85000字节(83kb)以上的对象为大对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值