C#GC的简单概述

1..NET 中超过80%都是托管资源(非托管资源为插件,或其他类库)

2.NET GC机制

 (1) 并不能释放所有资源,他不能释放非托管资源

 (2)GC并不是实时性的 者将会造成系统性能上的瓶颈和不确定性(所以有了IDisposable接口,内包含Dispose方法,使用这个方法可以释放非托管资源,使用using简化资源管理)

3. GC.Collect()强制经行垃圾回收 GC.colIlect (int 32)强制经行0代到指定代垃圾回收

GC Collect(int 32,GCCollectionMade)强制指定时间经行0代到指定代垃级回收。

4.GC注意事项: 

(1)只管理内存

(2)在独立的线程中运行 去删除不在引用的内存

(3)每次运行压缩托管堆

(4)必须对非托管资源进行释放 可以通过定义Finalizer来保证资源释放

(5) Finalizer在对象不被应用的某个不确定时间内执行

5.GC算法

1压缩算法 挂起线程->找到root节点->拿到对象图->标记(未标记的是要进行回收的垃圾-回收掉为被标记的垃圾-)->堆压缩->修复指针(压缩后堆索引到栈的内存地址发生变化,需要将指针指到正确的位置)

2分代算法

条件:1大量的短期的生命周期的对象创建(例如局部变量 ) 较老的生命周期的对象例如全局的对象会或者静态的

      2 对于大部分的内存回收 要比 全部的进行垃圾回收的操作快(有些生命周期长的对象不需要每次都对其进行判断是否需要进行回收)

      3 .Net将heap分为三个代龄区域 Gen0 Gen1 Gen2

首先如何Geno区域的内存达到阈值则Gc处理将存活的对象存入 Gen1.

如果Gen1中的内存达到阈值经行GC将存活的对象存入Gen3

他们执行的频率为100: 10: 1.

6判断足否被标记为存活对象算法:

Finalization Queue(完成队列]   FreachableQueuel(可达队列)存储的足对象指针,

进性Mark 可分辨出那些是垃圾

通过:NET对象提供的Finalize方法

Finalization Queue 从堆中发现没执行Finalize合将他冲垃级椎里就出来放到可达队列执行Finalize在杀死

Unty内存管理,

自行内存回收,定时堆上回收拉圾

强制垃级回收

堆上内存不够进行内存回收。

Unity Gc在. net上E层UNITY自己又封装了一些算法他去不定时去调。net的Gc.,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值